Django CSRF令牌只在生产中丢失

时间:2017-03-24 14:25:01

标签: ajax django forms django-csrf

我收到的CSRF_Token错误只发生在我的服务器上的生产模式中。但是当我使用runserver命令从我的计算机终端运行它时,一切都很好。我已经阅读了许多与此相关的其他问题而没有运气。似乎我的情况与其他情况略有不同,因为它在本地工作但不在生产中。

我在提交一个提交到views.py中的“submit”的Ajax表单时收到错误。有人知道是什么原因引起的吗?另外,在生产模式下查看我的cookie,CSRF_Token甚至没有开始。本地就是。谢谢你的帮助。

这是我的views.py

from django.shortcuts import render

from django.http import HttpResponse


def index(request):

    return render(request, 'index.html')


def submit(request):
    #Receive Request 
    inputone = request.POST['randominfo']
    inputtwo = request.POST['randominfo2']

    #Some more code here that setups response. 
    #Deleted since Im posting to StackOverflow

    return response

与Ajax提交有关的代码

$(function () {
    $.ajaxSetup({
        headers: { "X-CSRFToken": getCookie("csrftoken") }
    });
});

function getCookie(c_name)
{
    if (document.cookie.length > 0)
    {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1)
        {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start,c_end));
        }
    }
    return "";
 }
function submitAjax(event){

        $.ajax({
            type:'POST',
            url:'/submit/',
            data:{
                randominfo:document.getElementById('Random').innerHTML,
                randominfo2:document.getElementById('Random2').innerHTML,

            },
            dateType: 'json',
            success:function() {
                  # Url here  

            }

        })
    };

修复此问题的解决方案。

在views.py中添加“来自django.views.decorators.csrf import ensure_csrf_cookie”,然后在返回包含ajax表单的html文件的视图上方添加“@ensure_csrf_cookie”

2 个答案:

答案 0 :(得分:1)

错误发生是因为您没有设置csrf令牌,为了防止这种情况,我们必须检查一些细节

首先,您必须将csrf令牌设置为您的表单,在您的html中,您必须设置如下:

<form id="id" name="form">
    {% csrf_token %}
    <!-- Form body here -->
</form>

第二种将csrf cookie设置为您的请求标头的方法是可以的,我只建议您逐个设置数据字段,使用jquery的方法serialize

data: $("#your-form-id").serialize()

我建议您阅读此post关于使用django的ajax请求非常有帮助

答案 1 :(得分:0)

你可以做两件事:

1。)在ajax调用中提交CSRF令牌。您必须使用getCookie() javascript函数才能获得它。幸运的是,您可以复制和粘贴django文档has some code。 的JavaScript

$.ajax({
        type:'POST',
        url:'/submit/',
        data:{
            randominfo:document.getElementById('Random').innerHTML,
            randominfo2:document.getElementById('Random2').innerHTML,
            'csrfmiddlewaretoken': getCookie('csrftoken'), // add this
...

2.。)为您的/ submit视图禁用csrf。你可以用装饰器做到这一点。请注意,这样不太安全,因此请确保没有机密数据。

views.py:

from django.views.decorators.csrf import csrf_exempt
...
@csrf_exempt
def your_submit_view(request):
  #view code