我正在尝试使用flask-uploads上传文件,但遇到了一些问题。我将向您展示我的flask视图函数,html,希望有人能指出我遗漏了什么。
基本上发生的情况是,我提交了表单,但它在视图函数中的if request.method == 'POST' and form.validate():检查失败。它向下跳转以显示模板。wtforms没有在表单上踢出任何错误,所以我想知道为什么if语句会失败。
我忽略了什么?
设置flask上传:
# 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>发布于 2012-10-03 12:16:12
您有csrf_enabled=True,但是表单没有任何CSRF保护,因为您不是从SecureForm继承的。如果您想启用CSRF,请阅读documentation并更新表单定义。
如果这是意外的,您可以删除csrf_enabled=True,您的逻辑将按预期工作。
要启用CSRF保护,需要执行以下几个步骤:
表单中的generate_csrf_token和validate_csrf_token方法由
{{ form.csrf_token }} validate.https://stackoverflow.com/questions/12701671
复制相似问题