python - Flask 蓝图的注册顺序

标签 python google-app-engine flask

我遇到了一个奇怪的问题(对于有 flask 经验的人来说可能并不奇怪)。

我有一个在 Google App Engine 的 dev_appserver.py

上下文中运行的 Flask 应用程序

我的 flask 应用程序中有一个蓝图

# rest_server.py

rest_api = Blueprint('rest_api', __name__)
app = Flask(__name__)
app.register_blueprint(rest_api, url_prefix='/api')  # [1] DOESN'T WORK

@rest_api.route("/")
def hello():
  return "Hello World"

app.register_blueprint(rest_api, url_prefix="/api")  # [2] WORKS AS EXPECTED

我的 app.yaml

中有以下内容
-url: "/api/.*"
 script: rest_server.app

当我在位置 [1] 注册蓝图时点击 localhost:8080/api/ 时,我收到一条错误消息,指出没有匹配的端点。

但是,当我在 [2] 处注册 bluerpint 时,装饰器 之后的任何位置都有效。

是否需要在所有装饰器之后注册蓝图?

最佳答案

是的,只有在声明所有路线后才需要注册蓝图,至少如果您想使用这些路线。 (如果不介意路由不可用的话,注册蓝图后声明新路由其实没什么问题。)

如果您想知道原因:基本上,蓝图 url 规则仅在调用 Flask.register_blueprint 时才在应用程序上注册。如果您在注册蓝图后添加路由,它们只会在注册蓝图时添加到待办事项列表中 (Blueprint.deferred_functions),它们不会追溯添加到任何现有的应用程序中蓝图是过去注册的。

关于python - Flask 蓝图的注册顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40730312/

相关文章:

python - 如何使用 OCR 从低分辨率图像中获得更好/准确的结果

Python列表语法解释

python - 如何使用 Flask SQLAlchemy 从 mysql 获取有限数量的行?

python - 使用 AppEngine bulkloader 加载 db.ListProperty()

java - 如何获取具有父引用的实体?

python - 如何更改单个文档值的架构类型

python - Flask 将变量从应用程序主文件传递到蓝图

python - 如何使用 Pandas 中多列的条件从数据框中选择行?

python - 如何修改数据库中已经迁移的模型?

facebook - 阅读一些 Facebook 页面的墙贴并在谷歌应用引擎中显示