蓝图和路由的区别?
@main_bp.route 和 @app.route 本质都是给视图函数绑定 URL,区别在于:
@app.route 直接注册到 Flask 应用;
@main_bp.route 先注册到蓝图,蓝图再通过 app.register_blueprint() 注册到应用。
代码对比
方式一:直接用 @app.route
python
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login')
def login():
return '登录页'
@app.route('/register')
def register():
return '注册页'
if __name__ == '__main__':
app.run()
方式二:用蓝图 @main_bp.route
python
# app/main/__init__.py
from flask import Blueprint
main_bp = Blueprint('main', __name__)
from app.main import routes # 导入路由,避免循环导入
# app/main/routes.py
from flask import render_template
from app.main import main_bp
@main_bp.route('/')
def index():
return render_template('index.html')
# app/auth/routes.py
from flask import Blueprint
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/login')
def login():
return '登录页'
@auth_bp.route('/register')
def register():
return '注册页'
# app/__init__.py
from flask import Flask
from app.main import main_bp
from app.auth import auth_bp
def create_app():
app = Flask(__name__)
app.register_blueprint(main_bp) # /
app.register_blueprint(auth_bp, url_prefix='/auth') # /auth/login, /auth/register
return app
主要区别
| 维度 | @app.route |
@main_bp.route |
|---|---|---|
| 注册对象 | 直接注册到 app |
先注册到蓝图,再由 app 注册 |
| URL 前缀 | 每个路由手动写 | 注册时可统一加 url_prefix |
| 代码组织 | 适合小项目,路由容易堆在一起 | 适合按模块拆分,如 main、auth、api |
url_for |
url_for('index') |
url_for('main.index') |
| 复用性 | 不可复用 | 同一个蓝图可注册到多个应用或不同前缀 |
| 独立资源 | 共用 templates/、static/ |
蓝图可配置自己的模板和静态文件目录 |
企业里哪个用得多?
中小项目、练习项目、原型项目:@app.route 更常见,因为简单直接,文件少,不用一开始就拆模块。
正式项目、多人协作项目、中大型项目:蓝图用得更多。 实际工作中,Flask 项目通常会按功能拆成 main、auth、api、admin 等蓝图,再配合 create_app 工厂模式。
简单判断:
- 只有一个文件、几个路由 → 用
@app.route就行。 - 有登录、后台、API、用户中心等多个模块 → 用蓝图更合适。
- 准备做测试、多环境配置、多人开发 → 蓝图 +
create_app是更常见的工程化写法。