我在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
扩展为其他操作?
答案 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
独立于您定义路线的顺序。