开始学习 Python 和 Flask 作为学习练习,并且来自 PHP/Symfony2,我可以在表单中添加一个隐藏的 _method 字段,以使用 DELETE 或 PUT 覆盖 POST 方法。
似乎 Flask 本身不支持这一点,我一直在尝试各种想法,包括http://flask.pocoo.org/snippets/38/,它有效,但涉及将覆盖放在表单操作中,而不是而不是作为隐藏字段,IMO 使 URL 看起来难看。
上述地址的注释中有一个片段,它使 _method 从路由的角度工作,但正如那里所讨论的那样,如果您尝试访问视图中的 request.form ,确实会导致请求挂起。
有没有人有解决方法?如果没有,我将把所有的事情都当作 POST 来处理,但如果能找到一种方法让它工作起来就好了。
干杯。
编辑:这是任何想看看的人的代码:
模板:
<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>
应用程序/__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 = 'test@test.com'
if request.method == 'PUT':
emailvalue = request.form['email']
return render_template('login.html', email=emailvalue)