【问题标题】:Django csrftoken not setDjango csrftoken 未设置
【发布时间】:2016-04-02 14:31:27
【问题描述】:

我正在尝试按照docs 将 AJAX POST 与 Django 一起使用 - 如果我登录到该站点,这可以正常工作。但是,如果我已注销或使用隐身模式,我的 csrftoken 未设置 - 我已尝试将 {{csrf_token}} 进行检查,它返回值 NOTPROVIDED

什么可能导致令牌不生成?

  • 我正在使用render,所以我认为它不是context processor issue
  • django.middleware.csrf.CsrfViewMiddleware 存在,我没有更改任何默认 csrf 设置
  • ensure_csrf_cookie 装饰器工作正常

我正在运行 Django 1.7。

视图的简化版本(没有ensure_csrf_cookie 装饰器):

def pg2(request, **kwargs):
    name_slug = kwargs.pop('name_slug')
    num_guests = request.session['guests']
    date = request.session['date']

    venue = get_object_or_404(Venue, name_slug=name_slug)
    try:
        rental = request.session['rental']
    except:
        rental = None

    filtered_items = Item.objects.filter(venue_id=venue.pk)

    context = {'venue':venue, 'rental':rental, 'filtered_items':filtered_items}
    return render(request, 'app/pg2.html', context)

我在设置中的中间件:

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.common.BrokenLinkEmailsMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.redirects.middleware.RedirectFallbackMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'project.middleware.SecureRequiredMiddleware', # to add SSL
)

【问题讨论】:

  • 您也可以阅读有关使用ajax in the Django docs 的信息;如果您使用的是 jQuery,here is a wrapper 会为您服务。
  • 感谢@thornomad,如前所述,我正在关注文档中的代码。什么不起作用是 csrftoken 甚至没有首先生成 - 已经更新了问题。
  • 也许然后发布您的代码,特别是views.py。什么版本的 Django?

标签: ajax django cookies csrf


【解决方案1】:

您需要在所有 Ajax POST 中显式发送 cookie。要首先获取 cookie,您可以在 JS 文件中运行以下命令:

var c = getCookie('csrftoken');

但要使上述 getCookie 函数正常工作,请使用给定的代码创建一个新的 javascript 文件,并在您的 html 模板中调用它。希望它对你有用!

ajaxpostcsrf.js

function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
    var cookies = document.cookie.split(';');
    for (var i = 0; i < cookies.length; i++) {
        var cookie = jQuery.trim(cookies[i]);
        if (cookie.substring(0, name.length + 1) == (name + '=')) {
            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
            break;
        }
    }
}
return cookieValue;
}
$.ajaxSetup({
    headers: { "X-CSRFToken": getCookie("csrftoken") }
});

【讨论】:

  • 感谢@Utkarsh - 如前所述,我确实按照文档进行了尝试。什么不工作是 csrftoken 甚至没有首先生成。已更新问题。
猜你喜欢
  • 2016-10-10
  • 2014-10-03
  • 2017-12-04
  • 1970-01-01
  • 2015-11-06
  • 2020-11-08
  • 2019-03-28
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多