首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WTforms表单不提交,但不输出验证错误

WTforms表单不提交,但不输出验证错误
EN

Stack Overflow用户
提问于 2012-10-03 11:55:36
回答 1查看 2.4K关注 0票数 2

我正在尝试使用flask-uploads上传文件,但遇到了一些问题。我将向您展示我的flask视图函数,html,希望有人能指出我遗漏了什么。

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

我忽略了什么?

设置flask上传:

代码语言:javascript
复制
# Flask-Uploads
photos = UploadSet('photos',  IMAGES)
configure_uploads(app, (photos))

查看:

代码语言:javascript
复制
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)

表格:

代码语言:javascript
复制
class AddPhotoForm(Form):
    photo = FileField('Photo')
    client = IntegerField('Client:')
    event = IntegerField('Event:')

HTML:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-03 12:16:12

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

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

要启用CSRF保护,需要执行以下几个步骤:

表单中的generate_csrf_tokenvalidate_csrf_token方法由

  1. 继承而来。这些方法将生成唯一的键,并在不将{{ form.csrf_token }} validate.
  2. Add到您的模板时引发错误。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12701671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档