Skip to main content
 首页 » 编程设计

python之flask 在没有被询问时一直返回 "Username之This field is required. "

2024年10月25日28sharpest

我在“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 

但是它一直在呈现这个错误。我不知道那个错误在哪里。

请您参考如下方法:

我没有为 flask 使用 cookiecutter 的经验,但我注意到两件事:

您不需要传递 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 View 处理 POST 请求。