Python 如何覆盖Flask模块中PUT和DELETE的HTTP方法?

Python 如何覆盖Flask模块中PUT和DELETE的HTTP方法?,python,flask,werkzeug,Python,Flask,Werkzeug,在路由发生之前,我很难修改Flask请求对象 我的API模块(不是我的整个Flask应用程序)依赖于通过发送一个特殊的头来伪造PUT和DELETE操作。我需要检查“-Method”头的内容,并在Flask执行路由之前相应地修改Flask请求对象 这是我希望使用的简短、pythonic、显式代码: @api.before_request def method_scrubbing(): if request.headers.has_key('-Method'): method

在路由发生之前,我很难修改Flask请求对象

我的API模块(不是我的整个Flask应用程序)依赖于通过发送一个特殊的头来伪造PUT和DELETE操作。我需要检查“-Method”头的内容,并在Flask执行路由之前相应地修改Flask请求对象

这是我希望使用的简短、pythonic、显式代码:

@api.before_request
def method_scrubbing():
    if request.headers.has_key('-Method'):
        method = request.headers['-Method'].upper()
        tagalog.log("in before_request, -Method = {}".format(method), 'force')
        if method not in ['PUT', 'DELETE']:
            raise ApiMethodException(method)
        else:
            request.method = method
…但我从werkzeug得到一个“只读属性”错误:


我在上看到了Armin的帖子,但这似乎是应用程序范围内的(不特定于模块)。

Werkzeug假设请求只在WSGI中间件中修改,或者在Werkzeug访问数据之前修改。原因是,这样Werkzeug就不必监视WSGI环境,看它是否必须使缓存失效或改变行为

但是,在这种特殊情况下,如果您仔细修改底层WSGI环境,您可能会成功:

request.environ['REQUEST_METHOD'] = 'something'

在这之后,
request.method
应该显示“something”,并且行为应该更改为表单解析。我还没有试过,也不知道它是否有效。就我个人而言,我会编写一个中间件,对整个应用程序进行重写,或者对该行为进行一些简单的url前缀匹配。

不太管用。如果我像你说的那样做,并将
request.environ['request\u METHOD']
设置为
'PUT'
,那么
request.METHOD
确实会立即将值显示为
'PUT'
。但是,请求仍然被路由到它本来应该去的地方(在本例中,路由被
@api.route('/isoSpace//tile/',methods=['POST'])
修饰)。在该函数中,
request.method
再次类似于
'POST'
。有没有办法使中间件仅应用于一个模块?没有办法,因为中间件在WSGI层上运行。但是,您可以让中间件执行一些基本的路径检查。