在 Flask 中,为什么当你尝试验证收到的信息时,逻辑不验证表单?

问题描述 投票:0回答:1

希望你一切都好。

我在向数据库添加数据时遇到问题,当您作为用户尝试提交表单时,它使用 method = "POST" 发送它,效果很好,但是当它尝试使用表单验证它时,它不会工作。

这是我的html表单代码:

  <form method="POST" action="/contacto">
    <input name="name" type="text" class="feedback-input" placeholder="Nombre" />   
    <input name="email" type="text" class="feedback-input" placeholder="Email" />
    <input name="phone_number" type="text" class="feedback-input" placeholder="Teléfono" />
    <textarea name="message" class="feedback-input" placeholder="Mensaje"></textarea>
    <input type="submit" value="Enviar"/>
    <div class="check_aviso">
    </div>
</form>

这是我的routes.py代码:

@app.route('/contacto', methods=['GET', 'POST'])
def contacto():
    form = ContactInfoForm(request.form)
    context = {
        'form': form,
    }

    if request.method == 'POST':
        print("information sent via post")
        context['go_to_form'] = True

        if form.validate():
            print("also validated")
            name = form.name.data
            print(name)
            email = form.email.data
            phone_number = form.phone_number.data
            message = form.message.data
            user_info = ContactInfo(name=name, email=email, phone_number=phone_number, message=message)
            db.session.add(user_info)
            db.session.commit()
            send_contact_info_email(name, email, phone_number, message)
            flash(
                'Muchas gracias por la información, en la brevedad '
                + 'nos pondremos en contacto con usted.','success'
            )
            return redirect(
                url_for('contacto', _anchor='form')
            )
        else:
            flash('Data not saved','error')
        
        return render_template('contacto.html', **context)
    
    return render_template('contacto.html', **context)

这是我的forms.py:

class ContactInfoForm(FlaskForm):
    name = StringField('Nombre')
    email = StringField('Correo electrónico', validators=[Email()])
    phone_number = StringField('Número de teléfono')
    message = StringField('Mensaje')

这是我的模型.py:

class ContactInfo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)
    email = db.Column(db.String, nullable=True)
    phone_number = db.Column(db.String, nullable=True)
    message = db.Column(db.String, nullable=True)
    contact_date = db.Column(
        db.DateTime, nullable=False, server_default=db.func.now()
    )

数据未经验证,因此未添加/保存到数据库中。

forms validation flask flask-sqlalchemy flask-wtforms
1个回答
0
投票

我假设没有发送 CSRF 令牌,这就是验证失败的原因。
以下示例添加带有标记的隐藏字段。此外,在验证过程中会显示错误,这简化了用户的调试和处理。

from flask import (
    Flask, 
    flash, 
    redirect, 
    render_template, 
    request, 
    url_for
)
from flask_sqlalchemy import SQLAlchemy 
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import Email
from wtforms.widgets import TextArea

app = Flask(__name__)
app.config.from_mapping(
    SECRET_KEY='Your secret here!', 
    SQLALCHEMY_DATABASE_URI='sqlite:///demo.db' 
)
db = SQLAlchemy(app)

class ContactInfo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)
    email = db.Column(db.String, nullable=True)
    phone_number = db.Column(db.String, nullable=True)
    message = db.Column(db.String, nullable=True)
    contact_date = db.Column(db.DateTime, nullable=False, server_default=db.func.now())

class ContactInfoForm(FlaskForm):
    name = StringField(
        'Nombre', 
        render_kw={ 'placeholder': 'Nombre', }
    )
    email = StringField(
        'Correo electrónico', 
        validators=[Email()], 
        render_kw={ 'placeholder': 'Email', }
    )
    phone_number = StringField(
        'Número de teléfono', 
        render_kw={ 'placeholder': 'Teléfono', }
    )
    message = StringField(
        'Mensaje', 
        widget=TextArea(), 
        render_kw={ 'placeholder': 'Mensaje', }
    )

with app.app_context():
    db.drop_all()
    db.create_all()

@app.route('/contacto', methods=['GET', 'POST'])
def contact():
    form = ContactInfoForm(request.form)
    if form.validate_on_submit():
        contact_info = ContactInfo()
        form.populate_obj(contact_info)
        db.session.add(contact_info)
        db.session.commit()
        # ...
        flash(
            'Muchas gracias por la información, en la brevedad '\
            'nos pondremos en contacto con usted.','success'
        )
        return redirect(url_for('.contact', _anchor='form'))
    return render_template('contact.html', **locals())
<form method="POST">
    {{ form.csrf_token }}
    <div>
        {{ form.name.label() }}
        {{ form.name(class_='feedback-input') }}
        {% if form.name.errors -%}
        <ul>
            {% for error in form.name.errors -%}
            <li>{{ error }}</li>
            {% endfor -%}
        </ul>
        {% endif -%}
    </div>
    <div>
        {{ form.email.label() }}
        {{ form.email(class_='feedback-input') }}
        {% if form.email.errors -%}
        <ul>
            {% for error in form.email.errors -%}
            <li>{{ error }}</li>
            {% endfor -%}
        </ul>
        {% endif -%}
    </div>
    <div>
        {{ form.phone_number.label() }}
        {{ form.phone_number(class_='feedback-input') }}
        {% if form.phone_number.errors -%}
        <ul>
            {% for error in form.phone_number.errors -%}
            <li>{{ error }}</li>
            {% endfor -%}
        </ul>
        {% endif -%}

    </div>
    <div>
        {{ form.message.label() }}
        {{ form.message(class_='feedback-input') }}
        {% if form.message.errors -%}
        <ul>
            {% for error in form.message.errors -%}
            <li>{{ error }}</li>
            {% endfor -%}
        </ul>
        {% endif -%}
    </div>
    <button type="submit">Enviar</button>
</form>
© www.soinside.com 2019 - 2024. All rights reserved.