Изменение метода запроса с использованием скрытого поля _method во Flask

Начав собирать Python и Flask в качестве учебного упражнения и исходя из PHP / Symfony2, я мог добавить скрытое поле _method в форму, чтобы переопределить метод POST либо DELETE, либо PUT.

Кажется, настой неЯ не могу это поддержать, и ябыли взломаны с различными идеями, включаяhttp://flask.pocoo.org/snippets/38/, который работает, но включает помещение переопределения в действие формы, а не в качестве скрытого поля, которое делает IMO неприглядным.

В комментариях по вышеуказанному адресу есть фрагмент, который заставляет _method работать с точки зрения маршрутизации, но, как обсуждалось и там, действительно приводит к зависанию запроса, если вы затем попытаетесь получить доступ к request.form в представлениях.

У кого-нибудь есть обходной путь для этого? Если нет, то яЯ просто обработаю все как POST, но было бы неплохо найти способ заставить его работать.

Приветствия.

РЕДАКТИРОВАТЬ: Вот's код для тех, кто хочет взглянуть:

Шаблон:


    
    
    
    <a href="{{ url_for('reset_password') }}" class="forgot">Forgot password?</a>
    
        
        Remember me
    
    

Приложение / __ init__.py

from flask import Flask
from werkzeug.wrappers 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)

app = Flask(__name__)
app.wsgi_app = MethodRewriteMiddleware(app.wsgi_app)
from app import views

Посмотреть:

from flask import render_template
@app.route('/user/login', methods=['GET','POST','PUT'])
def login():
    emailvalue = '[email protected]'
    if request.method == 'PUT':
        emailvalue = request.form['email']
    return render_template('login.html', email=emailvalue)

Ответы на вопрос(2)

Ваш ответ на вопрос