flask 在没有被询问时一直返回 "Username - This field is required. "
flask keeps returning "Username - This field is required. " when it is not asked
我正在 "cookiecutter-flask" (https://github.com/sloria/cookiecutter-flask) 的基础上构建一个简单的问答应用程序。
所以我注册了一个名为 "interview" 的新蓝图并将 view.py 设置为:
from flask import (Blueprint, request, render_template, flash, url_for,
redirect, session, )
from flask.ext.login import login_required
from nektime.interview.forms import InterviewForm
from nektime.utils import flash_errors
blueprint = Blueprint("interview", __name__, url_prefix='/interview',
static_folder="../static")
@blueprint.route("/", methods=['GET', 'POST'])
@login_required
def interview():
form = InterviewForm(request.form)
if form.validate_on_submit():
new_answer = Answer.create(text=form.text.data)
flash("Your answer has been submitted")
return redirect(url_for('interview.interview'))
else:
flash_errors(form)
return render_template("interview/interview.html", form=form)
和form.py到:
from flask_wtf import Form
from wtforms import TextField, TextAreaField
from wtforms.validators import DataRequired, Length
from nektime.models import Answer
class InterviewForm(Form):
answer = TextAreaField('Answer',validators=[DataRequired(), Length(max=200)])
最后,model.py 到:
class Answer(SurrogatePK, Model):
__tablename__ = 'answers'
text = Column(db.String(400), nullable=True)
html代码是:
{% extends "layout.html" %}
{% block content %}
<div class="body-content">
<div class="row">
<h1>INTERVEIW</h1>
<p>This template was created by <a href="http://github.com/sloria/">Steven Loria</a> for use with the <a href="http://github.com/audreyr/cookiecutter/">cookiecutter</a> package by <a href="http://github.com/audreyr/">Audrey Roy</a>.</p>
</div>
<form method="POST" action="/" class="">
{{ form.hidden_tag() }}
{{ form.answer.label }} {{ form.answer(size=200) }}
<input type="submit" value="Go">
</form>
</div>
{% endblock %}
结果如下所示:
当我点击提交按钮时,页面显示如下并要求我输入用户名和密码,而我没有输入任何相关代码。
我试过:
-disabling other blueprints
-disabling other layouts
但它一直在渲染并出现此错误。我不知道那个错误在哪里。
我没有使用 cookiecutter for flask 的经验,但我注意到两件事:
您不需要传递 request.form
或 flash_errors(form)
,wtforms 会自动为您完成,因此您可以更改为:
def interview():
form = InterviewForm()
if form.validate_on_submit():
new_answer = Answer.create(text=form.text.data)
flash("Your answer has been submitted")
# I guess you want to redirect to / after form submission?
return redirect(url_for('home')) # whatever home page?
return render_template("interview/interview.html", form=form)
失败原因可能是:
<form method="POST" action="/" class="">
您正在发布到 "/"
路线,而这应该是 "/interview"
以便您的 interview
视图处理 POST 请求。
我正在 "cookiecutter-flask" (https://github.com/sloria/cookiecutter-flask) 的基础上构建一个简单的问答应用程序。
所以我注册了一个名为 "interview" 的新蓝图并将 view.py 设置为:
from flask import (Blueprint, request, render_template, flash, url_for,
redirect, session, )
from flask.ext.login import login_required
from nektime.interview.forms import InterviewForm
from nektime.utils import flash_errors
blueprint = Blueprint("interview", __name__, url_prefix='/interview',
static_folder="../static")
@blueprint.route("/", methods=['GET', 'POST'])
@login_required
def interview():
form = InterviewForm(request.form)
if form.validate_on_submit():
new_answer = Answer.create(text=form.text.data)
flash("Your answer has been submitted")
return redirect(url_for('interview.interview'))
else:
flash_errors(form)
return render_template("interview/interview.html", form=form)
和form.py到:
from flask_wtf import Form
from wtforms import TextField, TextAreaField
from wtforms.validators import DataRequired, Length
from nektime.models import Answer
class InterviewForm(Form):
answer = TextAreaField('Answer',validators=[DataRequired(), Length(max=200)])
最后,model.py 到:
class Answer(SurrogatePK, Model):
__tablename__ = 'answers'
text = Column(db.String(400), nullable=True)
html代码是:
{% extends "layout.html" %}
{% block content %}
<div class="body-content">
<div class="row">
<h1>INTERVEIW</h1>
<p>This template was created by <a href="http://github.com/sloria/">Steven Loria</a> for use with the <a href="http://github.com/audreyr/cookiecutter/">cookiecutter</a> package by <a href="http://github.com/audreyr/">Audrey Roy</a>.</p>
</div>
<form method="POST" action="/" class="">
{{ form.hidden_tag() }}
{{ form.answer.label }} {{ form.answer(size=200) }}
<input type="submit" value="Go">
</form>
</div>
{% endblock %}
结果如下所示:
当我点击提交按钮时,页面显示如下并要求我输入用户名和密码,而我没有输入任何相关代码。
我试过:
-disabling other blueprints
-disabling other layouts
但它一直在渲染并出现此错误。我不知道那个错误在哪里。
我没有使用 cookiecutter for flask 的经验,但我注意到两件事:
您不需要传递 request.form
或 flash_errors(form)
,wtforms 会自动为您完成,因此您可以更改为:
def interview():
form = InterviewForm()
if form.validate_on_submit():
new_answer = Answer.create(text=form.text.data)
flash("Your answer has been submitted")
# I guess you want to redirect to / after form submission?
return redirect(url_for('home')) # whatever home page?
return render_template("interview/interview.html", form=form)
失败原因可能是:
<form method="POST" action="/" class="">
您正在发布到 "/"
路线,而这应该是 "/interview"
以便您的 interview
视图处理 POST 请求。