2011-11-09 55 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請求中的參數傳遞? 希望有所幫助。