【问题标题】:Flask returns 'Method not allowed' when submitting formFlask 在提交表单时返回“不允许的方法”
【发布时间】:2019-12-07 11:34:56
【问题描述】:

我正在密切关注very brief tutorial from Flask-wtf here。我有一个问题,在我的 提交 页面表单中提交我的姓名后,它会给出“405 Method Not Allowed”消息,而不是将我引导到成功页面。

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,因此不会执行循环的内容。我在其中添加了一个未执行的简单打印语句。

【问题讨论】:

  • 可能action="/"需要改成action="/submit"
  • 当然。 @app.route('/success') 没有指定访问方法,因此默认为 GET。你需要@app.route('/success', methods=['POST'])
  • @roganjosh 添加后我仍然遇到同样的错误。
  • 嗯,好的。什么路线引发错误(查看控制台以查看请求的去向)?似乎有些不对劲
  • 尝试将action="/" 更改为action="{{ url_for('submit') }}"。我在这里遗漏了一些基本的东西,抱歉

标签: python flask flask-wtforms


【解决方案1】:

如果我假装确切地知道所有相对路径是如何解决的,那我就是在撒谎。但是,您可以通过更改来解决此问题:

<form method="POST" action="/">

到:

<form method="POST" action="{{ url_for('submit') }}">

这是真正有意义的事情之一,将问题交给图书馆来解决。渲染模板时使用url_for,它也适用于 Jinja2。

【讨论】:

  • @piccolo 会的,在这种情况下。等到你有蓝图等。然后有点多。只需指向视图名称并避免压力:)
【解决方案2】:

问题是你没有提到 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)

【讨论】:

  • 您好 Sanil,添加 POST 方法成功后,我仍然遇到同样的错误。
  • @Sanil 你为什么认为这是问题所在?表单处理代码在submit,已经接受POST,而不是success
  • @DanielRoseman 看起来if form.validate_on_submit() 没有返回True,因此它无法转到success 页面。你有什么想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多