Ändern der Anforderungsmethode mithilfe des ausgeblendeten Felds _method in Flask

Ich habe angefangen, Python und Flask als Lernübung aufzugreifen, und aus PHP / Symfony2 heraus konnte ich einem Formular ein verstecktes Feld _method hinzufügen, um die POST-Methode entweder mit DELETE oder PUT zu überschreiben.

Es scheint, dass Flask dies nicht nativ unterstützt, und ich habe mit verschiedenen Ideen herumgehackt, einschließlichhttp://flask.pocoo.org/snippets/38/Dies funktioniert, beinhaltet jedoch, dass die Überschreibung in die Formularaktion eingefügt wird und nicht als verstecktes Feld, wodurch die URL nach IMO unansehnlich erscheint.

In den Kommentaren der obigen Adresse befindet sich ein Snippet, das die Funktion von _method aus der Routing-Perspektive ermöglicht, aber, wie auch dort erläutert, dazu führt, dass die Anforderung hängt, wenn Sie dann versuchen, in den Ansichten auf request.form zuzugreifen.

Hat jemand eine Problemumgehung dafür? Wenn nicht, werde ich einfach alles als POST behandeln, wäre aber nett, wenn ich einen Weg finden könnte, es zum Laufen zu bringen.

Prost.

BEARBEITEN: Hier ist der Code für alle, die einen Blick darauf werfen möchten:

Vorlage:

<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

Aussicht:

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)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage