动态添加URL规则到Flask应用程序

时间:2011-11-09 18:39:49

标签: python flask

我正在编写一个应用程序,用户可以在其中存储可以为其指定REST接口的信息。 IE,在/<username>/rest/products存储产品列表。由于URL显然不为人所知,我试图想出在Flask中实现动态URL创建的最佳方法。我想到的第一种方法是编写一个包罗万象的规则,并从那里路由URL。但是当Flask已经内置它们时,我基本上复制了URL路由功能。所以,我想知道使用.add_url_rule()docs here,向下滚动一下)将它们直接附加到应用程序是不是一个坏主意。是否有特定原因不应该这样做?

2 个答案:

答案 0 :(得分:12)

每次执行add_url_rule()时,内部路由都会重新映射URL映射。这既不是线程安全也不是快速。我现在不明白为什么你需要用户特定的URL规则才能说实话。听起来你真的想要安装用户特定的应用程序吗?

也许这很有用:http://flask.pocoo.org/docs/patterns/appdispatch/

答案 1 :(得分: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

因此,对于这种护理,您并不需要动态地&#34;添加网址规则,而是使用带参数的网址规则,并使用单个函数处理各种情况。另一件需要考虑的事情是要真正考虑这种URL端点的用例。如果<username>是需要传入的参数,为什么不使用诸如/rest/product/<username>之类的URL规则或将其作为GET请求中的参数传递? 希望有所帮助。