【问题标题】:WTforms form not submitting but outputs no validation errorsWTforms 表单未提交但未输出验证错误
【发布时间】:2012-10-03 03:55:36
【问题描述】:

我正在尝试使用flask-uploads 进行文件上传,并遇到一些障碍。我将向您展示我的flask 视图函数、html,希望有人能指出我缺少的内容。

基本上发生的情况是我提交了表单,但它在视图函数中的if request.method == 'POST' and form.validate(): 检查失败。它跳下来显示模板。 wtforms 并没有在表单上给我任何错误,所以我想知道为什么它的 if 语句失败了。

我在看什么?

设置烧瓶上传:

# Flask-Uploads
photos = UploadSet('photos',  IMAGES)
configure_uploads(app, (photos))

查看:

def backend_uploadphoto():
    from Application import photos
    from Application.forms.backend import AddPhotoForm

    clients = Client.query.all()
    events = Event.query.order_by('date').all()

    form = AddPhotoForm(request.form, csrf_enabled=True)

    if request.method == 'POST' and form.validate():
        from uuid import uuid4

        uuid = uuid4()
        filename = '{0}.jpg'.format(uuid)

        photo = Photo(uid=uuid, client=request.form['client'], event=request.form['event'])

        photofile = photos.save(request.files.get('photo'), photo.filename)

        return redirect(url_for('backend'))

    return render_template('backend/addphoto.html', form=form, clients=clients, events=events)

表格:

class AddPhotoForm(Form):
    photo = FileField('Photo')
    client = IntegerField('Client:')
    event = IntegerField('Event:')

HTML:

<form action="{{url_for('backend_uploadphoto')}}" method="post">
        <p>
            {{form.client.label}}
            <select name="client">
                {% for client in clients %}
                <option value="{{client.id}}">{{client.fullname}}</option>
                {% endfor %}
            </select>
            {{form.client.errors}}
        </p>

        <p>
            {{form.event.label}}
            <select name="event">
                {% for event in events %}
                <option value="{{event.id}}">{{event.name}}</option>
                {% endfor %}
            </select>
            {{form.event.errors}}
        </p>

        <p><label for="photo">Photo:</label>{{form.photo}} <input type="submit" value="Upload"> {{form.photo.errors}}</p>
    </form>

【问题讨论】:

  • 如果你使用 Flask,我会说 - 试试 Flask-WTF。
  • @IgnasButėnas 整个星期都遇到类似的错误,但它肯定与 CSRF 无关,不幸的是 = (

标签: python flask wtforms


【解决方案1】:

您拥有csrf_enabled=True,但您的表单没有任何 CSRF 保护,因为您没有从 SecureForm 继承。如果您想启用 CSRF,请阅读 documentation 并更新您的表单定义。

如果这是无意的,您可以删除csrf_enabled=True,您的逻辑将按预期工作。

要启用 CSRF 保护,有几个步骤:

  1. 从SecureForm继承
  2. 在表单中创建generate_csrf_token 和validate_csrf_token 方法。这些方法将生成一个唯一的密钥,并在未验证时引发错误。
  3. 将{{ form.csrf_token }} 添加到您的模板中。

【讨论】:

  • 谢谢,真不敢相信我错过了。
  • 嘿,我知道这为时已晚,但是当验证错误不是针对字段而是针对烧瓶调试器或命令行时,flask-wtf 是否会抛出错误?
猜你喜欢
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
相关资源
最近更新 更多