Python Werkzeug:在检索之前修改Request值(表单和args)

时间:2013-11-03 16:29:34

标签: python werkzeug

在使用Werkzeug之前,是否有办法编辑请求值(表单和参数)?

我需要将请求值从utf8编码为iso88591。我创建了一个处理这个问题的函数。

我想在所有表单值上使用此函数,以便我避免以下第二行:

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

我无法从Werkzeug docs中弄清楚我需要什么。我想有一种方法可以继承Request类并覆盖其处理值的方法之一。非常感谢如何很好地实现这一点的具体例子。

1 个答案:

答案 0 :(得分: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