2

我在 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,它将列出 person 表的条目。或者,如果我有/api/equipment/2,它将检索设备表中 ID 为 2 的行。我有很多这些任务,它们基本上都只需要 CRUD。

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

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

4

1 回答 1

4

可以/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

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

于 2013-07-20T07:16:07.940 回答