我正在密切关注very brief tutorial from Flask-wtf here。我遇到一个问题,当我在 submit 页面表单中提交我的姓名后,它会显示“ 405 Method Not Allowed ”(不允许使用“ 405方法” )消息,而不是将我引导到成功页面。
from flask import Flask, render_template, redirect
from forms import MyForm
app = Flask(__name__)
app.secret_key = 'mysecretKey'
@app.route('/submit', methods=('GET', 'POST'))
def submit():
form = MyForm()
if form.validate_on_submit():
return redirect('/success')
return render_template('submit.html', form=form)
@app.route('/success')
def success():
return "Well done for entering your name!"
if __name__ == '__main__':
app.run(debug=True)
我的表格在这里:
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
class MyForm(FlaskForm):
name = StringField('name', validators=[DataRequired()])
我的Submit.html代码如下所示(就像本教程中一样):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Password page</title>
</head>
<body>
<form method="POST" action="/">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name(size=20) }}
<input type="submit" value="Go">
</form>
</body>
</html>
编辑:if form.validate_on_submit()
条件不会返回True,因此不会执行循环的内容。我在其中添加了一个未执行的简单打印语句。
答案 0 :(得分:2)
如果我假装确切地知道如何解决所有相对路径,那我会撒谎。但是,您可以通过以下方法解决此问题:
<form method="POST" action="/">
收件人:
<form method="POST" action="{{ url_for('submit') }}">
将问题传递给图书馆以弄清楚,这确实是有意义的事情之一。渲染模板时,请使用url_for
在Jinja2中也可以使用。
答案 1 :(得分:0)
问题是您没有提到方法success
应该处理POST请求。
from flask import Flask, render_template, redirect
from forms import MyForm
app = Flask(__name__)
app.secret_key = 'mysecretKey'
@app.route('/submit', methods=('GET', 'POST'))
def submit():
form = MyForm()
if form.validate_on_submit():
return redirect('/success')
return render_template('submit.html', form=form)
@app.route('/success')
def success():
return "Well done for entering your name!"
if __name__ == '__main__':
app.run(debug=True)
使用
from flask import Flask, render_template, redirect
from forms import MyForm
app = Flask(__name__)
app.secret_key = 'mysecretKey'
@app.route('/submit', methods=['GET', 'POST'])
def submit():
form = MyForm()
if form.validate_on_submit():
return redirect('/success')
return render_template('submit.html', form=form)
# This is the change I made.
@app.route('/success', methods=['POST'])
def success():
return "Well done for entering your name!"
if __name__ == '__main__':
app.run(debug=True)