覆盖Flask add_url_rule以路由特定URL

时间:2013-07-20 06:50:30

标签: python views flask class-based-views

我在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。

但是如果我想要覆盖我的路由,当我有一些像/api/analysis/summarize这样的理论上会调用一个执行即时工作的函数的URL时会怎样。有没有办法做到这一点?

或者唯一的方法是将我的网址扩展到/api/db/person/api/db/equipment/2以获取一组操作,将/api/other_work_type扩展为其他操作?

1 个答案:

答案 0 :(得分:3)

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

E.g:

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

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

独立于您定义路线的顺序。