【问题标题】:Django CSRF Token Missing Only in ProductionDjango CSRF 令牌仅在生产中丢失
【发布时间】:2017-08-17 12:58:20
【问题描述】:

我收到一个丢失的 CSRF_Token 错误,该错误仅在我的服务器上的生产模式下发生。但是,当我使用 runserver 命令从计算机终端运行它时,一切正常。我已经阅读了许多与此有关的其他问题,但没有运气。看来我的情况与其他情况略有不同,因为它在本地有效,但在生产中无效。

我在提交提交到views.py 中的“提交”的Ajax 表单时收到错误消息。有人知道是什么原因造成的吗?此外,在生产模式下查看我的 cookie,CSRF_Token 甚至都不存在。本地是这样。谢谢你的帮助。

这是我的意见.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中添加“from django.views.decorators.csrf import ensure_csrf_cookie”,然后在返回包含ajax表单的html文件的视图上方添加“@ensure_csrf_cookie”

【问题讨论】:

  • 为什么不直接将{% csrf_token %} 放入您的模板而不是尝试从cookie 中取出它?
  • 那是我没试过的一件事。生病回来汇报。谢谢

标签: ajax django forms django-csrf


【解决方案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 请求,这很有帮助

【讨论】:

    【解决方案2】:

    你可以做两件事:

    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
    

    【讨论】:

    • 禁用 CSRF 令牌不是一个好主意,在任何情况下都不应该这样做。
    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2020-11-23
    • 2016-01-04
    • 2021-11-13
    • 2012-04-20
    • 2012-09-25
    相关资源
    最近更新 更多