【问题标题】:Python Werkzeug: modify Request values (forms and args) prior to retrievalPython Werkzeug:在检索之前修改请求值(表单和参数)
【发布时间】:2013-11-03 16:29:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python werkzeug


    【解决方案1】:

    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

    【讨论】:

    • +1。谢谢。我基本上必须在调度程序中做这样的事情吗:request.form = parse_form_data(environ)[1]。如果是这样,我将如何覆盖 parse_form_data?
    • 最好保留请求字典的不变性,因此最好的方法可能是此处概述的方法:werkzeug.pocoo.org/docs/wrappers/… 这允许您混合自定义请求对象,并覆盖 @987654330 @。将编辑答案。
    • 阅读文档,看起来像在流中设置一个具有自己的字典表示的自定义属性可能是最好的。这是我使用文档提出的一个工作示例,很抱歉造成混淆:gist.github.com/DeaconDesperado/7292574
    • 确认工作后将使用链接进行编辑。我很确定这应该很好,但您可能希望根据您的用例让解码错误冒泡以便在应用程序中捕获。
    • 一切就绪。包括 immutabledict 和缓存装饰器的示例和解释。
    猜你喜欢
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2014-03-05
    相关资源
    最近更新 更多