首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复Flask-WTForms中的“CSRF令牌丢失”

如何修复Flask-WTForms中的“CSRF令牌丢失”
EN

Stack Overflow用户
提问于 2019-08-02 22:40:38
回答 1查看 392关注 0票数 3

我正在创建一个小型的公司门户网站。将有一个计算机数据库,其中包含有关公司所有计算机的信息。我正在创建一个用于编辑计算机属性的WTForm。我有一个页面,其中有一个包含计算机属性的表。每一行都有特殊的按钮。当用户按下其中之一时,我希望显示一个页面,其中的表单具有从数据库中获取的默认值。当我在View函数中编辑默认值时,我得到一个错误:

代码语言:javascript
复制
The CSRF token is missing.

我的视图功能:

代码语言:javascript
复制
def edit_computer(computer_id):
    if admin_can() or sysadmin_can():
        computer = models.Computer.query.filter_by(id=computer_id).one()
        user = models.User.query.filter_by(id=computer.user_id).one()
        email = user.email

        form = forms.EditComputerForm()
        form.email.default = user.email
        form.type_.default=computer.type_
        form.model.default = computer.model
        form.cpu.default = computer.cpu
        form.ram.default = computer.ram
        form.rom.default = computer.rom
        form.os.default = computer.os
        form.supplements.default = computer.supplements
        form.process()

        if form.validate_on_submit():
            ...

当我不设置默认值(删除此↓)时,代码可以正常工作

代码语言:javascript
复制
form.email.default = user.email
form.type_.default=computer.type_
form.model.default = computer.model
form.cpu.default = computer.cpu
form.ram.default = computer.ram
form.rom.default = computer.rom
form.os.default = computer.os
form.supplements.default = computer.supplements
form.process()

表格:

代码语言:javascript
复制
class EditComputerForm(FlaskForm):    
    email = EmailField("Owner's E-Mail",
                       validators=[DataRequired(), Email()])
    type_ = SelectField('type',
                        choices=[('Notebook', 'Notebook'), ('PC', 'PC')])
    model = StringField('Model')
    cpu = StringField('CPU')
    ram = StringField('RAM')
    rom = StringField('ROM')
    os = StringField('OS')
    supplements = TextAreaField('Supplements')
    submit = SubmitField('Edit')

HTML:

代码语言:javascript
复制
{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}

{% block app_content %}
<h3>Edit computer's properties {{ add_title }}</h3>
<hr>
{{ wtf.quick_form(form, button_map={'submit': 'primary'}) }}
{% endblock %}

{% block app_windows %}{% endblock %}

如何修复此错误?WTForm现在不工作了。

EN

回答 1

Stack Overflow用户

发布于 2020-10-01 20:42:38

form.process()毁掉了csrf进程。

要动态设置表单值,我建议您使用data属性,而不是default属性。这样你就不必调用form.process()了。

代码语言:javascript
复制
form.email.data= user.email
form.type_.data=computer.type_
form.model.data= computer.model
form.cpu.data= computer.cpu
form.ram.data= computer.ram
form.rom.data= computer.rom
form.os.data= computer.os
form.supplements.data= computer.supplements
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57328711

复制
相关文章

相似问题

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