报错:{‘csrf_token‘: [‘The CSRF token is missing.‘]}

flask实现一个简单的注册界面报错

register.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
<!--    {
  
  { form.hidden_tag() }}-->
    {
  
  {form.username.label}}
{
  
  {form.username}}
<br>
{
  
  {form.password.label}}
{
  
  {form.password}}
    <br>
{
  
  {form.password2.label}}
{
  
  {form.password2}}
<br>
{
  
  {form.submit}}
</form>

</body>
</html>

表单.py

复制代码
from flask import Flask, render_template, request
from wtforms import StringField, PasswordField, SubmitField
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired, EqualTo


app = Flask(__name__)
app.config['SECRET_KEY'] = 'abc123'


class Register(FlaskForm):
    username = StringField(label='Username', validators=[DataRequired("用户名不能为空")])
    password = PasswordField(label='password', validators=[DataRequired("密码不能为空")])
    password2 = PasswordField(label='password2', validators=[DataRequired("密码不能为空"), EqualTo('password')])
    submit = SubmitField(label='Sign Up')


@app.route('/register', methods=[ 'GET','POST'])
def register():
    form = Register()
    if request.method == 'POST':
        print(999)
        if form.validate_on_submit():
            print("验证成功")
            username = form.username.data
            password = form.password.data
            password2 = form.password2.data
            print(username, password, password2)
        else:
            print(form.errors)
            print("验证失败")
    elif request.method == 'GET':
        return render_template('register.html', form=form)
    return render_template('register.html', form=form)


if __name__ == '__main__':
    app.run(debug=True)
  • {'csrf_token': ['The CSRF token is missing.']} 表示在表单提交时,缺少 CSRF(跨站请求伪造)令牌。

  • 当使用 Flask-WTF 时,为了防止 CSRF 攻击,默认会启用 CSRF 保护。这意味着在表单中需要包含一个 CSRF 令牌,并且在表单提交时,服务器会验证这个令牌是否存在且有效。

    在你的 register.html 模板中,确保使用 form.hidden_tag() 来包含 CSRF 令牌。

相关推荐
用户9210802628610 分钟前
前端 Vue 专栏 06:异步更新机制、任务队列与 nextTick
前端
晴天1644 分钟前
Chrome DevTools 深度调试指南
前端·chrome·chrome devtools
林冠宏_指尖下的幽灵1 小时前
AI发展下的后编程时代思考
前端·人工智能·后端
_山海1 小时前
Bun入门指南
前端·javascript·后端
想睡懒觉1 小时前
我用 CSS 3D 做了个星空隧道 Loading,没有 Three.js
前端
labixiong1 小时前
transition 写在 CSS 变量上为什么不生效?给变量补张「类型身份证」
前端·css·html
YHL2 小时前
🧠 Agent 记忆进阶:总结压缩与向量检索 —— 从截断到 Milvus 长期记忆
前端·人工智能
用户921080262862 小时前
前端 Vue 专栏 05:从 Object.defineProperty 到 Proxy,彻底理解 Vue 响应式原理
前端
Fluxart.ai2 小时前
GPT Image 2.5 有使用次数限制吗?额度、并发、频率限制说明
服务器·前端·gpt
程序员海军2 小时前
AI 越来越强,为什么打工人反而越来越累、越来越内耗了?
前端·程序员·aigc