2011-05-26 56 views
7

我很難在路由發生之前嘗試修改Flask請求對象。如何覆蓋Flask模塊中PUT和DELETE的HTTP方法?

我的API模塊(不是我的整個Flask應用程序)依賴於通過發送特殊標頭來僞造PUT和DELETE操作。我需要檢查「-Method」頭的內容,並相應地修改Flask Request對象,然後Flask執行其路由。

這是短期,Python的,明確的代碼,我想工作:

@api.before_request 
def method_scrubbing(): 
    if request.headers.has_key('-Method'): 
     method = request.headers['-Method'].upper() 
     tagalog.log("in before_request, -Method = {}".format(method), 'force') 
     if method not in ['PUT', 'DELETE']: 
      raise ApiMethodException(method) 
     else: 
      request.method = method 

...但我從WERKZEUG得到一個「只讀屬性」錯誤:http://drktd.com/74yk

我看起來Armin在http://flask.pocoo.org/snippets/38/的帖子,但這似乎是應用程序範圍內(不是特定於一個模塊)。

回答

6

Werkzeug假設請求只在WSGI中間件中修改,或者在Werkzeug訪問數據之前修改。原因是這樣Werkzeug不必監視WSGI環境,看它是否必須使緩存無效或改變行爲。

request.environ['REQUEST_METHOD'] = 'something' 

request.method後應該顯示「東西」和行爲應該改變,形成解析:

在這種特殊情況下,如果你仔細修改基礎WSGI環境中,您可能會成功但是。我沒有試過這個,也不知道它是否會起作用。就我個人而言,我會寫一箇中間件來完成整個應用程序的重寫,或者爲這種行爲做一些簡單的url前綴匹配。

+0

不太好用。如果我按照你所說的那樣做,並且將request.environ ['REQUEST_METHOD']'設置爲''PUT'','request.method'確實在之後立即顯示值爲''PUT''。然而,該請求仍然被路由到它將要去的地方(在這種情況下,到用'@ api.route('/ isoSpace//tile/',methods = ['POST'])裝飾的路線) ')。在該函數中,'request.method'再次看起來像「POST」。 – 2011-05-26 22:32:05

+0

有沒有辦法讓中間件只適用於一個模塊? – 2011-05-26 22:36:28

+0

WSGI層中不存在中間件。但是,您可以讓中間件執行一些基本路徑檢查。 – 2011-05-27 11:17:08

相關問題