Flask-WTF 表单令牌不匹配:The CSRF Tokens do not match

flask-wtf
表单

#1

image

表单提交后验证不通过,打印出的错误是令牌不匹配,请问这个大概是哪里出问题了呢,不能是代码的问题吧

这个是前端代码:

            <form method="post" style="width: 40%;color: #be862d">
                {{ comment_form.csrf_token }}
                {{ field_form(comment_form.username,class="form-control") }}
                {{ field_form(comment_form.comment,class="form-control") }}
                {{ field_form(comment_form.submit,class="btn btn-default") }}
            </form>

这个是渲染表单字段的宏:

{% macro field_form(field) %}
    {{ field.label }}
    {{ field(**kwargs) }}
    {% if field.errors %}
        {% for error in field.errors %}
            <smal>{{ error }}</smal>
        {% endfor %}

    {% endif %}

{% endmacro %}

#2

秘钥配置也写了,实在想不通


#3

哪位大佬路过帮帮忙,必有重谢:rofl::rofl::rofl::rofl::rofl:


#4

还没找到原因?视图里实例化表单类的时候打印一下csrf_token,再和渲染的页面里面的token值对比一下


#6

你之前做了什么操作?试试清除浏览器 cookie。


#7

刚刚清除了cookie 还是不好使

这个是视图函数代码:

@blog_app.route("/post/<post_id>", methods=["GET","POST"])
def post(post_id):
    post = Post.query.filter_by(id=post_id).first()
    comment_form = CommentForm()
    print("第一个令牌为:{}".format(comment_form.csrf_token))
    if comment_form.validate_on_submit():
        username = comment_form.username.data
        comment = comment_form.comment.data
        print("第二个令牌为:{}".format(comment_form.csrf_token))
        comment_sql = Comment(username=username,comment=comment,post_id=post_id)
        db.session.add(comment_sql)
        db.session.commit()
        return redirect(url_for("blog.post"))
    else:
        print("错误原因为:{}".format(comment_form.errors))
    return render_template("blog/post.html",post=post,comment_form=comment_form)


这个是输出信息:


#8

可以打印 cookie 里的 token 值对比一下:

print(session['csrf_token'])

(下次发帖请在标题内加入关键的错误信息,见修改后的标题。并且不要使用截图给出文本信息,使用纯文本代码块。)


#9

我不会对比,是这样写吗

@blog_app.route("/post/<post_id>", methods=["GET","POST"])
def post(post_id):
    post = Post.query.filter_by(id=post_id).first()
    comment_form = CommentForm()
    if comment_form.validate_on_submit():
        username = comment_form.username.data
        comment = comment_form.comment.data
        comment_sql = Comment(username=username,comment=comment,post_id=post_id)
        db.session.add(comment_sql)
        db.session.commit()
        return redirect(url_for("blog.post"))
    if request.method == "POST" and comment_form.validate_on_submit() == False:
        print("错误原因为:{}".format(comment_form.errors))
        print("前端生成的csrf字段为:{}".format(comment_form.csrf_token))
        print("session的csrf令牌值为:{}".format(session["csrf_token"]))
    return render_template("blog/post.html",post=post,comment_form=comment_form)

打印信息为:

(flask-env) (base) 227:number_one adminkai$ flask run
 * Serving Flask app "biger_blog" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with fsevents reloader
 * Debugger is active!
 * Debugger PIN: 221-179-919
127.0.0.1 - - [24/Apr/2019 10:07:31] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [24/Apr/2019 10:07:33] "GET /post/96 HTTP/1.1" 200 -
错误原因为:{'csrf_token': ['The CSRF tokens do not match.']}
前端生成的csrf字段为:<input id="csrf_token" name="csrf_token" type="hidden" value="ImRjZDM2ZWQyZWViN2I0MjBlNzA3MjI0M2Q1MzUzZmE5MGE0ZGJkYzIi.XL_E7Q.kbGbIj-6Y39ry3DzpLhhy3O3FTY">
session的csrf令牌值为:dcd36ed2eeb7b420e7072243d5353fa90a4dbdc2
127.0.0.1 - - [24/Apr/2019 10:07:41] "POST /post/96 HTTP/1.1" 200 -

``

#10

我已经找到了终极解决办法:rofl::rofl:: WTF_CSRF_ENABLED = False


#11

好办法……:sweat_smile:

打印出来的值的确是不匹配的。如果你确认清除了浏览器 cookie 的话,暂时不清楚为什么会出现这种情况。或许可以考虑换个浏览器试一下。