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.formflash_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 请求。