2011-11-09 34 views
9

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

回答

12

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

也许这是有帮助的:http://flask.pocoo.org/docs/patterns/appdispatch/

+0

我有同样的要求,即我正在寻找一种方法来动态地添加新的端点到[Eve](http://python-eve.org)使用它的'register_resource'方法构建的API,该方法调用' add_url_rule'在内部。请注意,对于每个请求都不会发生这种情况,只有在收到特定端点的“POST”时才会触发,因此性能不应该成为问题。 – kynan

+0

这里的要求完全相同。 Api,需要在某个路由发生PUT请求时添加和删除新路由。在我的情况下,我用烧瓶宁静,但基本上是一样的。 – cllamach

+0

看来我可以在before_request中做到这一点,如果我使用threading.lock,但是,我不知道如何停止与url_for有以下错误的问题:ValueError:在排序过程中修改列表错误:应用程序:内部服务器错误,列表修改在排序 – pip

0

我有过类似的要求对我的应用程序,其中对于给定的SOMEID每个端点/<SOMEID>/rest/other应界定为不同的功能。实现此目的的一种方法是保留一个查找字典,其中的值是处理特定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 

所以这种关心你并不真的需要“动态”添加URL规则,而是使用带有参数中的URL规则和处理的各类案件withing单功能。需要考虑的另一件事是真正考虑这种URL端点的用例。如果<username>是需要传入的参数,为什么不使用url规则(如/rest/product/<username>)或将它作为GET请求中的参数传递? 希望有所帮助。