我正在编写一个应用程序,用户可以在其中存储可以为其指定REST接口的信息。 IE,在/<username>/rest/products
存储产品列表。由于URL显然不为人所知,我试图想出在Flask中实现动态URL创建的最佳方法。我想到的第一种方法是编写一个包罗万象的规则,并从那里路由URL。但是当Flask已经内置它们时,我基本上复制了URL路由功能。所以,我想知道使用.add_url_rule()
(docs here,向下滚动一下)将它们直接附加到应用程序是不是一个坏主意。是否有特定原因不应该这样做?
答案 0 :(得分:12)
每次执行add_url_rule()
时,内部路由都会重新映射URL映射。这既不是线程安全也不是快速。我现在不明白为什么你需要用户特定的URL规则才能说实话。听起来你真的想要安装用户特定的应用程序吗?
答案 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请求中的参数传递?
希望有所帮助。