【问题标题】:How can I override the HTTP methods for PUT and DELETE in a Flask Module?如何在 Flask 模块中覆盖 PUT 和 DELETE 的 HTTP 方法?
【发布时间】:2011-09-02 21:27:39
【问题描述】:

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

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

这是我想要工作的简短、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 收到“只读属性”错误:http://drktd.com/74yk

我在 http://flask.pocoo.org/snippets/38/ 看到了 Armin 的帖子,但这似乎是应用范围的(不特定于模块)。

【问题讨论】:

    标签: python flask werkzeug


    【解决方案1】:

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

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

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

    之后request.method 应该显示“某事”并且行为应该更改为表单解析。我没有尝试过,不知道它是否会起作用。就我个人而言,我会编写一个中间件来重写整个应用程序,或者可能为该行为做一些简单的 url 前缀匹配。

    【讨论】:

    • 不太好用。如果我按照你说的那样做,并将request.environ['REQUEST_METHOD'] 设置为'PUT'request.method 确实在之后立即将值显示为'PUT'。然而,请求仍然被路由到它本来会去的地方(在这种情况下,路由到用@api.route('/isoSpace/<player_id>/tile/<tile_id>', methods=['POST']) 装饰的路由)。在该函数中,request.method 再次看起来像 'POST'
    • 有没有办法让中间件只适用于一个模块?
    • 没有作为中间件在 WSGI 层上运行。但是,您可以让中间件执行一些基本的路径检查。
    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多