我正在阅读Flask示例,该示例从单个脚本应用程序转换为应用程序工厂,因此引入了蓝图。使用蓝图的原因是因为应用程序实例现在是在运行时创建的,而不是存在于全局范围中(就像在单个脚本应用程序中一样)。这会导致app.route装饰器在调用create_app()
后存在,本书说明为时已晚。为什么在调用create_app()
后app.route装饰器存在为时已晚?为什么我们要在调用create_app()
之前访问路由?
答案 0 :(得分:0)
编写应用工厂时,在调用工厂之前,您没有应用实例。仅在运行服务器时调用工厂,但您需要在运行服务器之前定义路径。因此,您将它们附加到蓝图上,并在工厂中在应用程序上注册蓝图。
# this would fail, app doesn't exist
@app.route('/blog/<int:id>')
def post(id):
...
# this works because the route is registered on the blueprint
# which is later registered on the app
blog_bp = Blueprint('blog', __name__, url_prefix='/blog')
@blog_bp.route('/<int:id>')
def post(id):
...
def create_app():
app = Flask(__name__)
...
app.register_blueprint(blog_bp)
...
return app
# app still doesn't exist, it only exists when the server uses the factory