Alterando o método de solicitação usando o campo oculto _method no Flask

Comecei a pegar Python e Flask como um exercício de aprendizado, e vindo do PHP / Symfony2, eu poderia adicionar um campo _method oculto a um formulário para sobrescrever o método POST com um DELETE ou PUT.

Parece que o Flask não suporta isso nativamente, e eu tenho andado por aí com várias idéias, incluindohttp://flask.pocoo.org/snippets/38/, que funciona, mas envolve colocar a substituição na ação de formulário, e não como um campo oculto, que a IMO faz com que a URL pareça desagradável.

Há um trecho nos comentários do endereço acima, o que torna o _method funcionando de uma perspectiva de roteamento, mas, conforme também discutido lá, faz com que a solicitação seja interrompida se você tentar acessar request.form nas visualizações.

Alguém tem uma solução para isso? Se não, eu só vou lidar com tudo como POST, mas seria bom poder encontrar uma maneira de fazê-lo funcionar.

Felicidades.

EDITAR: Aqui está o código para quem quiser dar uma olhada:

Modelo:

<form action="{{ url_for('login') }}" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input class="span12" name="email" type="text" placeholder="E-mail address" value="{{ email }}">
    <input class="span12" name="password" type="password" placeholder="Your password">
    <a href="{{ url_for('reset_password') }}" class="forgot">Forgot password?</a>
    <div class="remember">
        <input id="remember-me" type="checkbox">
        <label for="remember-me">Remember me</label>
    </div>
    <input class="btn-glow primary login" type="submit" name="submit" value="Log in">
</form>

app / __ 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

Visão:

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)

questionAnswers(2)

yourAnswerToTheQuestion