Как я могу переопределить методы HTTP для PUT и DELETE в модуле Flask? - PullRequest
8 голосов
/ 26 мая 2011

Мне трудно изменить объект запроса Flask до того, как произойдет маршрутизация.

Мой API-модуль (а не все приложение Flask) зависит от подделки операций PUT и DELETE путем отправки специального заголовка. Мне нужно проверить содержимое заголовка "-Method" и соответствующим образом изменить объект запроса Flask, прежде чем Flask выполнит свою маршрутизацию.

Это короткий, питонский, явный код, с которым я бы хотел поработать:

@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/, но, похоже, оно касается всего приложения (не относится к модулю).

1 Ответ

7 голосов
/ 27 мая 2011

Werkzeug предполагает, что запрос изменяется только в промежуточном программном обеспечении WSGI или до того, как Werkzeug получит доступ к данным. Причина заключается в том, что таким образом Werkzeug не нужно отслеживать среду WSGI, чтобы определить, нужно ли ему аннулировать кэши или изменить поведение.

В этом конкретном случае вы можете добиться успеха, однако, если вы будете осторожны, изменив базовую среду WSGI:

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

После этого request.method должен показать «что-то», и поведение должно измениться, чтобы сформировать синтаксический анализ. Я не пробовал это и не знаю, будет ли это работать. Лично я написал бы промежуточное программное обеспечение, которое выполняет переписывание для всего приложения или, возможно, выполняет какое-то простое сопоставление префикса URL для этого поведения.

...