首页 > 解决方案 > 即使存在 {{ form.hidden_​​tag() }},Flask-WTForms 也不会验证

问题描述

我已经给出了我的forms.py,routes.pycreatePatient.html(相关截图) 的片段。我以前有一个登录同一个应用程序的表单,我遇到了同样的错误,我删除了旧项目并启动了这个新项目。

路线.py

@app.route("/createPatient",methods=['GET','POST'])
def create():
    form1 = createPatient(request.form)
    if form1.validate_on_submit():
        print("Sucess")
        return redirect('/index')
    else:
        print("Unsuccessful")

    return render_template("createPatient.html", form = form1)

当我输入时的输出form1.validate()false并且form1.errors{}并且打印不成功

表格.py


class createPatient(FlaskForm):
    ssn_id = IntegerField("SSN ID", validators = [DataRequired()])
    name = StringField("Patient Name",validators=[DataRequired()])
    age = IntegerField("Patient Age",validators=[DataRequired()])
    doa = DateField("Date of Admission",validators=[DataRequired()])
    tob = SelectField("Type of Bed", choices = [('General Ward'),('Semi Sharing'),('Single Room')],validators =[DataRequired()])
    address = StringField("Address", validators=[DataRequired()])
    city = StringField("City", validators=[DataRequired(), Length(min = 6 ,max = 20)])
    state = StringField("State", validators=[DataRequired(), Length(max = 30)])
    create = SubmitField("Create Patient")

上述文件中没有语法错误

createPatient.html

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

    {{ form.hidden_tag() }}

    <p>
        {{ form.ssn_id.label }}
        {{ form.ssn_id(size = 9 ) }}
        {% for error in form.ssn_id.errors %}
            <span class="error-message">*{{ error }}</span>
        {% endfor %}<br>
    </p>

    <p>
        {{ form.name.label }}
        {{ form.name(size = 35 ) }}
        {% for error in form.name.errors %}
            <span class="error-message">*{{ error }}</span>
        {% endfor %}<br>
    </p>

    <p>
        {{ form.age.label }}
        {{ form.age(size = 35 ) }}
        {% for error in form.age.errors %}
            <span class="error-message">*{{ error }}</span>
        {% endfor %}<br>
    </p>
    <p>
        {{ form.doa.label }}
        {{ form.doa(size = 35 ) }}
        {% for error in form.doa.errors %}
            <span class="error-message">*{{ error }}</span>
        {% endfor %}<br>
    </p>
    
        {{ form.tob.label }}
        {{ form.tob() }}
        {% for error in form.tob.errors %}
            <span class="error-message">*{{ error }}</span>
        {% endfor %}<br>
    
    <p>
        {{ form.address.label }}
        {{ form.address(size = 35 ) }}
        {% for error in form.address.errors %}
            <span clas="error-message">*{{ error }}</span>
        {% endfor %}<br>
    </p>
    <p>
        {{ form.city.label }}
        {{ form.city(size = 35 ) }}
        {% for error in form.city.errors %}
            <span clas="error-message">*{{ error }}</span>
        {% endfor %}<br>
    </p>
    <p>
        {{ form.state.label }}
        {{ form.state(size = 35 ) }}
        {% for error in form.state.errors %}
            <span clas="error-message">*{{ error }}</span>
        {% endfor %}<br>
    </p>

   <p> {{ form.create ()}} </p>

</form>

配置文件

import os

class Config(object):
    SECRET_KEY = os.urandom(32)

初始化.py

from flask import Flask 
from config import Config
from flask_mongoengine import MongoEngine

app =Flask(__name__)
app['SECRET_KEY']= Config.SECRET_KEY

标签: pythonflaskflask-wtformswtforms

解决方案


据我所知,CSRF 令牌是使用SECRET_KEY. 在您的config.py文件中,我看到了SECRET_KEY = os.urandom(32). 每次重新加载应用程序时,您的密钥都会被新密钥替换。这可能会导致 CSRF 错误。

而是尝试在外部生成密钥并将其放在 .env 或 config.py 中:

SECRET_KEY = 'super-secret-random-key'

或者

import os
class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY')

推荐阅读