3

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

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

我想在所有表单值上使用这个函数,这样我就可以避免下面的第二行:

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

我无法从 Werkzeug文档中弄清楚我需要什么。我想有一种方法可以对 Request 类进行子类化并覆盖其中一个处理值的方法。真的很感激一个关于如何很好地实现这一点的具体例子。

4

1 回答 1

3

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

于 2013-11-03T16:33:35.707 回答