覆盖 Flask add_url_rule 以路由特定的 URL

Posted

技术标签:

【中文标题】覆盖 Flask add_url_rule 以路由特定的 URL【英文标题】:Overriding Flask add_url_rule to route a specific URL 【发布时间】:2013-07-20 06:50:29 【问题描述】:

我在 Flask 中使用基于类的视图来创建 CRUD REST API 并使用 add_url_rule 注册路由,就像这样...

class GenericAPI(MethodView):
    def get(self, item_group, item_id):
        ...
    def post(self, item_group, item_id):
        ...
    ...

api_view = GenericAPI.as_view('apps_api')
app.add_url_rule('/api/<item_group>', defaults='item_id': None,
                 view_func=api_view, methods=['GET',])
app.add_url_rule('/api/<item_group>/<item_id>', 
                 view_func=api_view, methods=['GET',])
app.add_url_rule('/api/<item_group>/add', 
                 view_func=api_view, methods=['POST',])
app.add_url_rule('/api/<item_group>/<item_id>/edit', 
                 view_func=api_view, methods=['PUT',])
app.add_url_rule('/api/<item_group>/<item_id>/delete', 
                 view_func=api_view, methods=['DELETE',])

它处理基于item_group 的特定数据库表和使用item_id 的条目。因此,如果我有/api/person,它将列出人员表的条目。或者如果我有/api/equipment/2,它将检索设备表中 ID 为 2 的行。我有很多这样的任务,它们基本上都只需要 CRUD。

但是,当我有一些其他 URL(如 /api/analysis/summarize)时,如果我想覆盖我的路由怎么办,理论上它会调用一个执行动态工作的函数。有没有办法做到这一点?

或者是将我的 URL 扩展到 /api/db/person/api/db/equipment/2 用于一组操作和 /api/other_work_type 用于其他操作的唯一方法?

【问题讨论】:

我重新阅读了文档,发现您可以使用 defaults 传递值。所以我最终做的不是app.add_url_rule('/api/&lt;item_group&gt;/&lt;item_id&gt;', view_func=api_view, methods=['GET',]),而是改为app.add_url_rule('/api/person/&lt;item_id&gt;', view_func=api_view, methods=['GET',]) 【参考方案1】:

您可以正常注册/api/analysis/summarize。 Werkzeug/Flask 按复杂性(变量的数量)对规则进行排序,首先采用最简单的路线。

例如:

@app.route('/api/foo')
def foo():
    return "Foo is special!"

@app.route('/api/<name>')
def generic(name):
    return "Hello %s!" % name

与您定义路线的顺序无关。

【讨论】:

以上是关于覆盖 Flask add_url_rule 以路由特定的 URL的主要内容,如果未能解决你的问题,请参考以下文章

Flask学习第6天:app.add_url_rule调用路由

Flask--路由系统

flask路由系统

Flask快速入门 — flask路由的本质

Flask高级编程

flask源代码笔记——路由