那年那日那朵花

".......(o´ω`o)......"

django模板中用ajax提交时csrf的tips

2017-10-20 16:40 django

一般而言可以直接参照官方文档的步骤来做,但是之前我遇到个小问题。

我在一个页面中使用ajax来提交表单,我按照官方文档来操作,但是调试时返回的是403报csrf没有通过。后来调试的发现我在页面打开的时候console.log(csrftoken)报null。详细读了下官方文档后,明白过来,其实一般而言,我们会在页面template中的表单处添加{% csrf_token %}这一段,同时在view中返回页面时渲染一把生成csrf token然后添加进返回的内容里面。但是我是通过ajax来提交。这个时候页面中并没有{% csrf_token %},同时返回给前端的也只仅仅是json而已。所以这个时候官方文档中的范例代码会直接将csrftoken变量返回null。所以就会报403了,那怎么解决的呢,再看文档,

Warning
If your view is not rendering a template containing the csrf_token template tag, Django might not set the CSRF token cookie. This is common in cases where forms are dynamically added to the page. To address this case, Django provides a view decorator which forces setting of the cookie: ensure_csrf_cookie().

以上一段以前一直忽略,现在看到就懂了。所以现在要做的就是在需要用ajax提交表单的页面所对应的view上加上ensure_csrf_cookie这个装饰器就可以了。例如

from django.views.decorators.csrf import ensure_csrf_cookie
from django.shortcuts import render

@ensure_csrf_cookie
def my_view(request):
    c = {}
    # ...
    return render(request, "a_template.html", c)

然后再页面上刷新一下看F12就会发现我们的csrftoken出现了。

这里再说下,一般而言我们需要自定义sessionid和csrftoken的命名。可以在settings.py中用SESSION_COOKIE_NAME与CSRF_COOKIE_NAME这两个来定义

Cloudhu 个人随笔|built by django|

沪ICP备16019452号-1