动态添加URL规则到Flask应用

9 投票
2 回答
10226 浏览
提问于 2025-04-17 05:58

我正在写一个应用程序,用户可以在里面存储他们指定的REST接口的信息。比如说,可以在/<username>/rest/products这个地址下存储一份产品列表。因为这些网址显然是事先不知道的,所以我在想在Flask中实现动态网址创建的最佳方法。我想到的第一种方法是写一个通用的规则,然后从那里路由网址。但这样的话,我基本上是在重复Flask已经内置的URL路由功能。所以,我在想直接使用.add_url_rule()这里有文档,往下翻一点)将它们直接添加到应用程序中,这样做是不是一个坏主意?有没有什么特别的原因不应该这样做?

2 个回答

0

我在我的应用中也遇到过类似的需求,每个端点 /<SOMEID>/rest/other 对于给定的 SOMEID 应该绑定到不同的功能。实现这个的一个方法是保持一个查找字典,字典里的值是处理特定 SOMEID 的函数。例如,看看这个代码片段:

func_look_up_dict = {...}
@app.route('<SOMEID>/rest/other', methods=['GET'])
def multiple_func_router_endpoint(SOMEID):
    if SOMEID in func_look_up_dict.keys():
        return jsonify({'result' = func_look_up_dict[SOMEID]()}), 200
    else:
        return jsonify({'result'='unknown', 'reason'='invalid id in url'}), 404

所以在这种情况下,你其实不需要“动态”添加网址规则,而是可以使用一个带参数的网址规则,然后在一个函数中处理各种情况。还有一点需要考虑的是,真的要想想这样的网址端点的使用场景。如果 <username> 是一个需要传入的参数,为什么不使用像 /rest/product/<username> 这样的网址规则,或者在GET请求中作为参数传入呢?希望这些对你有帮助。

11

每次你执行 add_url_rule() 的时候,内部的路由系统会重新映射网址规则。这既不安全,也不快。老实说,我现在不太明白为什么你需要针对用户的特定网址规则。这听起来有点像你其实想要为每个用户设置专属的应用程序?

也许这个链接对你有帮助: http://flask.pocoo.org/docs/patterns/appdispatch/

撰写回答