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