从Flask app访问原始请求字符串

时间:2011-12-06 13:01:30

标签: python httprequest flask

是否可以从Flask应用程序中访问原始的未解析的请求数据?

2 个答案:

答案 0 :(得分:3)

经过一段时间的深入挖掘,我想我可以回答你的问题。

Flask的请求对象是Werkzeug的请求对象的子类,并做了一些包装。在查看Werkzeug的请求对象之后,程序员显然不打算让您访问未解析的请求对象,但无论如何您都可以这样做。

回想一下Flask和Werkzeug是WSGI兼容的。因此,您可以访问未解析的数据,如下所示:

Request.environ['wsgi.input']

这个问题是您必须自己手动搜索输入流,这可能会很困难。另外,我认为Request对象可能会处理流并将wsgi.input留空。

我们需要继承Flask的Request对象:

class newRequest(Request):
    # here is the cool part!
    def _load_form_data(self):
        super(newRequest, self)._load_form_data()
        # stream is a local variable in Werkzeug's _load_form_data() method
        self.UNPARSED_STREAM = stream
        # now we should be able to access the request through Request.UNPARSED_STREAM

# now, we need to tell Flask to use our Request object
app.request_class = newRequest

请注意,我们正在搞乱类内部。这是一个危险的黑客。我也没有测试过这个解决方案,但它似乎应该对我有用。

答案 1 :(得分:0)

这个问题有点过时,但有人可以像我一样来到这里。 =)

我设法做到了,但对整个应用来说。因此,您有责任在所有路径中解码请求的所有数据。

通过将请求字符集设置为None,您基本上可以禁用所有编码。它可以完成werkzeug的BaseRequest类的子类化或简单地:

application = Flask('api')
application.request_class.charset = None
[...]

这对我有用。