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

Yar*_*lav 3 python flask python-3.x wtforms flask-wtforms

我正在创建一个小型企业门户网站。将会有一个计算机数据库,其中包含有关公司中所有计算机的信息。我正在创建一个 WTForm 用于编辑计算机的属性。我有一个页面,其中包含包含计算机属性的表格。每行都有特殊的按钮。当用户按下其中一个时,我想显示一个带有从数据库获取默认值的表单的页面。当我在视图函数中编辑默认值时,出现错误:

\n\n
The CSRF token is missing.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的查看功能:

\n\n
def edit_computer(computer_id):\n    if admin_can() or sysadmin_can():\n        computer = models.Computer.query.filter_by(id=computer_id).one()\n        user = models.User.query.filter_by(id=computer.user_id).one()\n        email = user.email\n\n        form = forms.EditComputerForm()\n        form.email.default = user.email\n        form.type_.default=computer.type_\n        form.model.default = computer.model\n        form.cpu.default = computer.cpu\n        form.ram.default = computer.ram\n        form.rom.default = computer.rom\n        form.os.default = computer.os\n        form.supplements.default = computer.supplements\n        form.process()\n\n        if form.validate_on_submit():\n            ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我不设置默认值时(删除此 \xe2\x86\x93),代码工作正常

\n\n
form.email.default = user.email\nform.type_.default=computer.type_\nform.model.default = computer.model\nform.cpu.default = computer.cpu\nform.ram.default = computer.ram\nform.rom.default = computer.rom\nform.os.default = computer.os\nform.supplements.default = computer.supplements\nform.process()\n
Run Code Online (Sandbox Code Playgroud)\n\n

形式:

\n\n
class EditComputerForm(FlaskForm):    \n    email = EmailField("Owner\'s E-Mail",\n                       validators=[DataRequired(), Email()])\n    type_ = SelectField(\'type\',\n                        choices=[(\'Notebook\', \'Notebook\'), (\'PC\', \'PC\')])\n    model = StringField(\'Model\')\n    cpu = StringField(\'CPU\')\n    ram = StringField(\'RAM\')\n    rom = StringField(\'ROM\')\n    os = StringField(\'OS\')\n    supplements = TextAreaField(\'Supplements\')\n    submit = SubmitField(\'Edit\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

HTML:

\n\n
{% extends \'base.html\' %}\n{% import \'bootstrap/wtf.html\' as wtf %}\n\n{% block app_content %}\n<h3>Edit computer\'s properties {{ add_title }}</h3>\n<hr>\n{{ wtf.quick_form(form, button_map={\'submit\': \'primary\'}) }}\n{% endblock %}\n\n{% block app_windows %}{% endblock %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何修复这个错误?WTForm 现在无法运行。

\n

Rus*_*shK 5

form.process()破坏了 csrf 进程。

要动态设置表单值,我建议您使用 data 属性,而不是默认属性。那你就不用打电话了form.process()

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
Run Code Online (Sandbox Code Playgroud)