仅在生产中缺少 Django CSRF 令牌

Django CSRF Token Missing Only in Production

我收到一个丢失的 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 Whosebug

    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 中添加 "from django.views.decorators.csrf import ensure_csrf_cookie",然后在 returns 包含 [=35= 的 html 文件的视图上方添加“@ensure_csrf_cookie” ] 表格

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

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

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

第二种将 csrf cookie 设置为您的请求的方法 header 是可以的,我只建议您使用 [=27= 的方法 serialize 而不是一个一个地设置您的数据字段]

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

我想推荐你阅读这个post关于ajax使用django请求非常有帮助

您可以做两件事:

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