Iniziare a prendere Python e Flask come un esercizio di apprendimento e provenire da PHP/Symfony2, potrei aggiungere un campo _method nascosto a un modulo per sovrascrivere il metodo POST con un DELETE o METTERE.Cambiare il metodo di richiesta usando il campo nascosto _method in Flask
Sembra che Flask non supporti questo in modo nativo, e ho hackerato con varie idee incluso http://flask.pocoo.org/snippets/38/, che funziona, ma comporta l'override nell'azione modulo, piuttosto che come campo nascosto, che IMO rende l'URL appare sgradevole.
C'è uno snippet nei commenti dell'indirizzo precedente, il che rende _method funzionare da una prospettiva di routing, ma come discusso anche lì, fa sì che la richiesta si blocchi se si tenta di accedere a request.form nelle viste .
Qualcuno ha una soluzione alternativa per questo? In caso contrario, gestirò tutto come POST, ma sarebbe bello riuscire a trovare un modo per farlo funzionare.
Cheers.
EDIT: Ecco il codice per chi vuole dare un'occhiata:
Template:
<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
Vista:
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)
[Request.Form] (http: // flask.pocoo.org/docs/quickstart/#the-request-object) potrebbe esserti utile. – John
Ciao @johnthexiii, grazie per il tuo commento. Sto già utilizzando request.form per controllare se _method è impostato, ma una volta che lo faccio e cambio REQUEST_METHOD nel middleware, non posso accedere a request.form nelle viste (l'app si blocca). Questo è il collegamento con il suggerimento che stavo cercando: http://flask.pocoo.org/snippets/38/#comment-box (secondo commento) – aleayr
Ho messo un po 'di codice per dare una visione migliore di cosa Sto cercando di ottenere. – aleayr