【发布时间】:2015-07-24 22:51:54
【问题描述】:
我正在尝试编写一个中间件,当它在正文中找到“_method”参数时,它将 POST 请求重写为不同的方法。网上有人写了这段代码:
from werkzeug import Request
class MethodRewriteMiddleware(object):
def __init__(self, app, input_name='_method'):
self.app = app
self.input_name = input_name
def __call__(self, environ, start_response):
request = Request(environ)
if self.input_name in request.form:
method = request.form[self.input_name].upper()
if method in ['GET', 'POST', 'PUT', 'DELETE']:
environ['REQUEST_METHOD'] = method
return self.app(environ, start_response)
据我了解,它会解析表单,检索可能的“_method”参数,如果找到并列入白名单,它将覆盖当前方法。它适用于 DELETE 请求,并且可以毫无问题地重写该方法。但是,当我尝试发送一个常规的、非重写的 POST 时,这个中间件会使整个应用程序挂起。我最好的猜测是,由于我在中间件中访问了主体,因此主体不再可用于应用程序,因此它永远挂起。但是,这似乎不会影响重写的请求,因此代码最深的代码路径(检查白名单)可以正常工作,但其他代码路径会以某种方式破坏/阻止请求。
我认为这无关紧要,但我正在将此中间件安装在 Flask 应用之上。
编辑:我认为尝试从 Flask 中的处理程序访问 request 是阻塞的。 Flask 是否在内部使用互斥锁或类似的东西?
我什至不确定如何调试它。
【问题讨论】:
-
尝试使用
from flask import request并使用烧瓶请求对象 -
您可以通过不使用 werkzeug 来验证您的假设,而是自己根据环境编写相关的查询字符串解析。这应该不难(cgi-module 有帮助),然后你可以确定你没有接触到身体。或者更好的是,使用 shallow-parameter 来请求。顺便说一句,您的问题具有误导性,因为对此的唯一答案是“是的,当然”。你可以在 WSGI 中对传递的参数做任何你想做的事情,如果你在传递它们(或完全新奇的)时仍然符合 WSGI - 对你有好处。您关心的只是 werkzeug 的参与。
标签: python python-3.x wsgi