Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 当验证器条件不满足时,为什么wtforms不生成错误?_Python 3.x_Flask Sqlalchemy_Flask Wtforms - Fatal编程技术网

Python 3.x 当验证器条件不满足时,为什么wtforms不生成错误?

Python 3.x 当验证器条件不满足时,为什么wtforms不生成错误?,python-3.x,flask-sqlalchemy,flask-wtforms,Python 3.x,Flask Sqlalchemy,Flask Wtforms,所以我正在研究一个表单,它有两个输入和一个检查条件。如果不满足检查条件,则引发错误。否则取db中的值。 下面是我的forms.py脚本 from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, validators # Define QuoteForm below class QuoteForm(FlaskForm): # qauthor = StringField("Quote A

所以我正在研究一个表单,它有两个输入和一个检查条件。如果不满足检查条件,则引发错误。否则取db中的值。 下面是我的
forms.py
脚本

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, validators

# Define QuoteForm below
class QuoteForm(FlaskForm):
  # qauthor = StringField("Quote Author",[validators.DataRequired(message="This field is required"),validators.Length(min =3, max =100,message = "Field must be between 3 and 100 characters long.")])
  qauthor = StringField("Quote Author",validators=[validators.DataRequired(message="This field is required"),validators.Length(min =3, max =100,message = "Field must be between 3 and 200 characters long.")])
  qstring = StringField("Quote",validators=[validators.DataRequired(message="This field is required"),validators.Length(min =3, max =200,message = "Field must be between 3 and 200 characters long.")])
  submit = SubmitField(" Add Quote")
如您所见,两个文件的最小长度都应大于3。 我还在HTML页面
addquote.HTML

<body>
<h2>QuoteForm</h2>
<form action="", method="post">
  <p>
    {{form.qauthor.label}} : {{form.qauthor}}<br>
    {%for error in form.qauthor.errors%}
    <span style="color: red;">[{{ error }}]</span><br>

    {% endfor %}

  </p>
    <p>
    {{form.qstring.label}} : {{form.qstring}}<br>
    {%for error in form.qstring.errors%}
    <span style="color: red;">[{{ error }}]</span><br>
    {% endfor %}
  </p>

    <p>{{form.submit}}</p>
</form>
</body>
  • 现在我传递的输入是引述作者:“在”和引述作者:“这是一个美丽的世界”
  • 引用作者:“AT”和引用作者:“RT”
对于我在forms.py中提到的条件,这两种情况我都没有得到错误。py最小长度为3。 为什么错误没有出现或验证没有发生? 附属国: 烧瓶(wtf)='0.14.3'
flask=='1.0.2'

您需要调用表单的
validate()
方法。通过调用
validate\u on\u submit()
,可以更方便地完成此操作,这是检查活动请求是否提交(POST、PUT、PATCH或DELETE)以及表单数据是否有效的快捷方式()

下面是简单的完整示例代码,没有数据库,只是打印出表单的数据

app.py

from flask import Flask, render_template, url_for
from flask_wtf import FlaskForm
from markupsafe import Markup
from wtforms import StringField, SubmitField, validators


class QuoteForm(FlaskForm):
    author = StringField(
        "Quote Author",
        validators=[
            validators.DataRequired(message="This field is required"),
            validators.Length(min=3, max=100, message="Field must be between 3 and 200 characters long.")
        ]
    )
    quote = StringField(
        "Quote",
        validators=[
            validators.DataRequired(message="This field is required"),
            validators.Length(min=3, max=200, message="Field must be between 3 and 200 characters long.")
        ]
    )
    submit = SubmitField(" Add Quote")


app = Flask(__name__)
app.config['SECRET_KEY'] = 'MY SECRET KEY'


@app.route('/', methods=['GET'])
def index():
    _quote_url = url_for('add_quote')
    return Markup(f'<a href="{_quote_url}">Add Quote</a')


@app.route('/add-quote/', methods=['GET', 'POST'])
def add_quote():
    form = QuoteForm()
    if form.validate_on_submit():
        print(f'Author: {form.author.data}')
        print(f'Quote: {form.quote.data}')
        return "Quote form is validated"

    return render_template("add-quote.html", form=form)


if __name__ == '__main__':
    app.run()
从烧瓶导入烧瓶,呈现模板,url
来自flask_wtf进口FlaskForm
从markupsafe导入标记
从wtforms导入StringField、SubmitField和validators
等级报价表(烧瓶形式):
作者=StringField(
“引用作者”,
验证器=[
validators.DataRequired(message=“此字段为必填项”),
validators.Length(最小值=3,最大值=100,message=“字段长度必须介于3到200个字符之间。”)
]
)
quote=StringField(
“引用”,
验证器=[
validators.DataRequired(message=“此字段为必填项”),
validators.Length(最小值=3,最大值=200,message=“字段长度必须介于3到200个字符之间。”)
]
)
提交=提交字段(“添加报价”)
app=烧瓶(名称)
app.config['SECRET_KEY']='MY SECRET KEY'
@app.route('/',方法=['GET'])
def index():
_quote\u url=url\u for('add\u quote'))

返回标记(f'Add Quote表单验证成功。正在进行检查。问题是,现在程序没有使用您提供的代码执行if条件。是的,我已经删除了断点。还使用if块内的一些打印语句进行了检查。if块不执行。@DanishXavier-您没有将
csrf_令牌
包含在表单中。我已经添加了一个简单的完整示例(我已经更改了一些变量名)。没有。我是这个wtf表单的新手。是否需要添加csrf_令牌?@DanishXavier-因为您从
FlaskForm
csrf令牌字段(
csrf_令牌
)继承了您的表单正在自动生成,您必须将其包含在表单的HTML中,否则在验证特定表单字段之前验证将失败。请尝试在HTML中注释出
csrf_标记
,然后提交报价,您将看到一条关于csrf的错误消息。@DanishXavier-参见此。
@app.route('/addquote/', methods=['GET', 'POST'])
def add_quote():
    form = QuoteForm()
    if form.validate_on_submit():
        breakpoint()
        add_tab = Quotes(quoteauthor=form.qqauthor.data, quotestring=form.qqstring.data)
        db.session.add(add_tab)
        db.session.commit()
        return render_template("addquote_confirmation.html")

    return render_template("addquote.html",form=form)
from flask import Flask, render_template, url_for
from flask_wtf import FlaskForm
from markupsafe import Markup
from wtforms import StringField, SubmitField, validators


class QuoteForm(FlaskForm):
    author = StringField(
        "Quote Author",
        validators=[
            validators.DataRequired(message="This field is required"),
            validators.Length(min=3, max=100, message="Field must be between 3 and 200 characters long.")
        ]
    )
    quote = StringField(
        "Quote",
        validators=[
            validators.DataRequired(message="This field is required"),
            validators.Length(min=3, max=200, message="Field must be between 3 and 200 characters long.")
        ]
    )
    submit = SubmitField(" Add Quote")


app = Flask(__name__)
app.config['SECRET_KEY'] = 'MY SECRET KEY'


@app.route('/', methods=['GET'])
def index():
    _quote_url = url_for('add_quote')
    return Markup(f'<a href="{_quote_url}">Add Quote</a')


@app.route('/add-quote/', methods=['GET', 'POST'])
def add_quote():
    form = QuoteForm()
    if form.validate_on_submit():
        print(f'Author: {form.author.data}')
        print(f'Quote: {form.quote.data}')
        return "Quote form is validated"

    return render_template("add-quote.html", form=form)


if __name__ == '__main__':
    app.run()
<body>
<h2>QuoteForm</h2>
<form action="" method="post">
    {{ form.csrf_token }}
    <p>
        {% for error in form.errors %}
            <span style="color: red;">[{{ error }}]</span><br>
        {% endfor %}
    </p>
    <p>
        {{ form.author.label }} : {{ form.author }}<br>
        {% for error in form.author.errors %}
            <span style="color: red;">[{{ error }}]</span><br>

        {% endfor %}

    </p>
    <p>
        {{ form.quote.label }} : {{ form.quote }}<br>
        {% for error in form.quote.errors %}
            <span style="color: red;">[{{ error }}]</span><br>
        {% endfor %}
    </p>

    <p>{{ form.submit }}</p>
</form>
</body>