Flask新手提问:如何为工厂模式应用从其他模块添加视图?
Flask工厂模式下添加视图的最简方法
嘿,我完全懂你的感受——刚接触Flask工厂模式时,想把视图拆分到不同文件确实容易卡壳,尤其是觉得蓝图有点复杂的时候。先直接说:你尝试的那种from views import goodbye的方式行不通,因为views.py里的@app.route引用的app根本没定义——工厂模式里的app是在create_app函数内部动态创建的,其他文件没法直接拿到这个实例。
下面给你两种简单的解决方案,从最简的无蓝图方式开始:
方案1:不用蓝图,通过注册函数绑定视图
这是小项目里最直接的方式,不需要引入蓝图的概念:
1. 修改views.py,写一个接收app的注册函数
把视图路由的注册逻辑包装成一个函数,让它接收创建好的app实例:
# views.py def register_routes(app): @app.route('/goodbye') def goodbye(): return 'Goodbye, World!' # 可以在这里加更多视图,比如 @app.route('/hello-again') def hello_again(): return 'Hello again!'
2. 在create_app里调用注册函数
回到你的工厂函数里,导入views并调用这个注册函数,把刚创建的app传进去:
# __init__.py import os from flask import Flask def create_app(test_config=None): # 创建并配置应用(原代码不变) app = Flask(__name__, instance_relative_config=True) app.config.from_mapping( SECRET_KEY='dev', DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'), ) if test_config is None: app.config.from_pyfile('config.py', silent=True) else: app.config.from_mapping(test_config) try: os.makedirs(app.instance_path) except OSError: pass # 注册外部视图 from . import views views.register_routes(app) # 原有的hello视图 @app.route('/hello') def hello(): return 'Hello, World!' return app
这样运行后,/goodbye和/hello-again就能正常访问了,完全不用碰蓝图。
方案2:最简版蓝图用法(适合未来扩展)
如果之后你的项目变大,拆分多个模块的话,蓝图还是更清晰的。其实用最简版的蓝图也没那么复杂:
1. 在views.py中创建蓝图
# views.py from flask import Blueprint # 创建一个名为'main'的蓝图,参数__name__是当前模块名 bp = Blueprint('main', __name__) @bp.route('/goodbye') def goodbye(): return 'Goodbye, World!'
2. 在create_app里注册蓝图
只需要在工厂函数里添加一行注册代码:
# __init__.py # ... 原有的配置代码 ... def create_app(test_config=None): app = Flask(__name__, instance_relative_config=True) # ... 原有的配置代码 ... # 注册蓝图 from . import views app.register_blueprint(views.bp) # 原有的hello视图 @app.route('/hello') def hello(): return 'Hello, World!' return app
这种方式的好处是,之后如果要加更多视图文件(比如auth.py处理登录注册),只需要创建新的蓝图并注册就行,不会把所有路由挤在一个文件里,扩展性更好。
总结一下:小项目用方案1最省事,不用额外学习蓝图;如果之后项目要扩展,方案2的最简蓝图用法也足够简单,不会有太多复杂的配置。
内容的提问来源于stack exchange,提问作者David J.
相关产品推荐
相关产品推荐

