表单提交后验证不通过,打印出的错误是令牌不匹配,请问这个大概是哪里出问题了呢,不能是代码的问题吧
这个是前端代码:
<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 %}
waynerv
(Xie Wei)
4
还没找到原因?视图里实例化表单类的时候打印一下csrf_token,再和渲染的页面里面的token值对比一下
greyli
(Grey Li)
6
你之前做了什么操作?试试清除浏览器 cookie。
刚刚清除了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)
这个是输出信息:
greyli
(Grey Li)
8
可以打印 cookie 里的 token 值对比一下:
print(session['csrf_token'])
(下次发帖请在标题内加入关键的错误信息,见修改后的标题。并且不要使用截图给出文本信息,使用纯文本代码块。)
我不会对比,是这样写吗
@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 -
``
我已经找到了终极解决办法: WTF_CSRF_ENABLED = False
greyli
(Grey Li)
11
好办法……
打印出来的值的确是不匹配的。如果你确认清除了浏览器 cookie 的话,暂时不清楚为什么会出现这种情况。或许可以考虑换个浏览器试一下。