Cambio del método de solicitud utilizando el método de campo oculto en Flask

Comencé a seleccionar Python y Flask como un ejercicio de aprendizaje y, desde PHP / Symfony2, podría agregar un campo de método oculto a un formulario para anular el método POST con DELETE o PUT.

Parece que Flask no admite esto de forma nativa, y he estado hackeando con varias ideas, incluyendohttp://flask.pocoo.org/snippets/38/, que funciona, pero implica poner la anulación en la acción de formulario, en lugar de como un campo oculto, que IMO hace que la URL se vea desagradable.

Hay un fragmento en los comentarios de la dirección anterior, que hace que _method funcione desde una perspectiva de enrutamiento, pero tal como se analiza aquí también, hace que la solicitud se bloquee si intenta acceder a request.form en las vistas.

¿Alguien tiene una solución para esto? Si no, solo manejaré todo como POST, pero sería bueno poder encontrar una manera de hacerlo funcionar.

Aclamaciones.

EDITAR: Aquí está el código para cualquier persona que quiera echar un vistazo:

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

Ver:

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)

Respuestas a la pregunta(2)

Su respuesta a la pregunta