蓝图和路由的区别?
@main_bp.route和@app.route本质都是给视图函数绑定 URL,区别在于:
@app.route直接注册到 Flask 应用;
@main_bp.route先注册到蓝图,蓝图再通过app.register_blueprint()注册到应用。
代码对比
方式一:直接用@app.route
fromflaskimportFlask,render_template app=Flask(__name__)@app.route('/')defindex():returnrender_template('index.html')@app.route('/login')deflogin():return'登录页'@app.route('/register')defregister():return'注册页'if__name__=='__main__':app.run()方式二:用蓝图@main_bp.route
# app/main/__init__.pyfromflaskimportBlueprint main_bp=Blueprint('main',__name__)fromapp.mainimportroutes# 导入路由,避免循环导入# app/main/routes.pyfromflaskimportrender_templatefromapp.mainimportmain_bp@main_bp.route('/')defindex():returnrender_template('index.html')# app/auth/routes.pyfromflaskimportBlueprint auth_bp=Blueprint('auth',__name__)@auth_bp.route('/login')deflogin():return'登录页'@auth_bp.route('/register')defregister():return'注册页'# app/__init__.pyfromflaskimportFlaskfromapp.mainimportmain_bpfromapp.authimportauth_bpdefcreate_app():app=Flask(__name__)app.register_blueprint(main_bp)# /app.register_blueprint(auth_bp,url_prefix='/auth')# /auth/login, /auth/registerreturnapp主要区别
| 维度 | @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是更常见的工程化写法。