2013-11-03 42 views
2

在使用它之前,Werkzeug有辦法編輯請求值(表單和參數)嗎?Python Werkzeug:在檢索之前修改請求值(表單和參數)

我需要將請求值從utf8編碼爲iso88591。我創建了一個函數來處理這個問題。

我想,讓我避免以下的第二行使用此功能上的所有表單值:

lcl_var = request.form['post_arg']   
lcl_var = encode_utf8_to_iso88591(lcl_var) 

我想不出我從WERKZEUG docs需要什麼。我想有一種方法可以對Request類進行子類化並重寫處理這些值的方法之一。真的很感激一個關於如何實現這個好的具體例子。

回答

2

在Werkzeug文檔中擴展請求解析時存在一個有限的示例。它有點埋沒,但聲音很好。

http://werkzeug.pocoo.org/docs/request_data/#how-to-extend-parsing

由於WERKZEUG是通過HTTP的相當低層次的工具,這個功能也可以在你的請求分派實施(假設一個類似的WERKZEUG教程的結構,適用該URL的功能映射到該請求)

編輯

似乎每WERKZEUG文檔,要做到這一點的最好辦法是你自己的請求屬性加工出來的流。它會是不錯的做,這是它保留了request.form財產的不變性的方式:

def encode(value): 
    #Your logic for the new dict vals 
    return 'foo!' 

class MixInRequest(Request): 
    max_content_length = 1024 * 1024 * 4 

    @cached_property 
    def lcl_data(self): 
     if self.method in ['POST','PUT','PATCH']: 
      fields = dict([(key, encode(val)) for (key,val) in self.form.items()]) 
      return ImmutableMultiDict(fields) 
     return None 

這將設置一個請求屬性lcl_data(你的函數命名),將在第一次訪問和高速緩存的後續調用解析。它僅適用於填充request.form的方法。

完整的示例在這裏:

https://gist.github.com/DeaconDesperado/7292574

+0

+1。謝謝。我基本上不得不在調度器中做這樣的事情:'request.form = parse_form_data(environ)[1]'。如果是這樣,我將如何重寫parse_form_data? – ksindi

+1

這可能是最好的保存請求字典的不變性,所以最好的方法可能是這裏概述的:http://werkzeug.pocoo.org/docs/wrappers/?highlight=request.form#base-wrappers這允許你混入你的自定義請求對象,並覆蓋'form_data_parser'。將編輯答案。 – DeaconDesperado

+1

閱讀文檔,它看起來像設置一個自定義屬性與自己的字典表示直接流可能是最好的。這裏有一個我使用文檔想出的工作示例,對於混淆抱歉: https://gist.github.com/DeaconDesperado/7292574 – DeaconDesperado