【问题标题】:Ajax post to Django view CSRF forbiddenAjax 发布到 Django 视图 CSRF 被禁止
【发布时间】:2013-08-24 07:21:11
【问题描述】:

问题

CSRF 阻止我发布到 Django 视图。

我正在关注official django docs 的解决方案和这个问题:Django CSRF check failing with an Ajax POST request。一切都应该设置好,但是执行时会失败。

我的设置如下,

jQuery post 方法:

var send_data = { 'name': place.name, 'address': address};

var csrftoken = $.cookie('csrftoken'); 

function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
} 

$.ajaxSetup({
    crossDomain: false, // obviates need for sameOrigin test
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

$.ajax({ url: '/results/',
    type: 'POST',
    data: send_data,
    success: function(response) {
      $('#results').html(response);
    }
  });

Django 视图:

def results(request):
    return render(request, "stamped/restaurant.html")

网址.py

urlpatterns = patterns('',
    url(r'^$', views.home, name='home'),
    url(r'results/', views.results, name='results'),
)

一切都应该没问题。知道我缺少什么吗?

我也累了:

Unable to jQuery $.post data to a view in django due to CSRF

Jquery Ajax Post to Django View

错误输出:

更新:

这个问题的代码是正确的。看来我的浏览器缓存需要清空了。

【问题讨论】:

  • 你安装了jquery cookie插件吗?一种验证方式 - alert(csrftoken) 是否返回任何内容?
  • @karthikr 我已经正确安装了 jquery cookie。执行 alert(csrftoken) 显示 cookie。
  • 更改主页视图以发送 csrf 令牌 cookie from django.middleware.csrf import get_token def index(request): get_token(request) return render_to_response('index.html', context_instance=RequestContext(请求))
  • @sawangupta 没有 get_token 模块。我假设您的意思是官方文档 here 显示的 from django.core.context_processors import csrf,但将其放在主视图中与我的问题无关。
  • 你有没有从 django.middleware.csrf 导入 get_token 考虑这个帖子groups.google.com/forum/#!msg/dajaxproject/vszhg1hv74Q/…

标签: javascript jquery python django


【解决方案1】:

在您的问题中,您的模板中缺少模板标签{{ csrf_token }}

来自文档:

如果您的视图未呈现包含 csrf_token 模板标签的模板,则 Django 可能不会设置 CSRF 令牌 cookie。这在表单被动态添加到页面的情况下很常见。为了解决这种情况,Django 提供了一个视图装饰器来强制设置 cookie:ensure_csrf_cookie()。

【讨论】:

  • 嘿,再次,丹,我在调用此代码的 html 模板(未在上面发布)的正文中有标记 {% csrf_token %}。上面的第一段代码是一个外部 js 脚本。我使用var csrftoken = $.cookie('csrftoken'); 获取该外部脚本中的令牌,我应该使用{{ csrf_token }} 获取它吗?
  • 不,你做得对。检查js变量csrftoken的值。
  • 并通过添加error: function(obj, status, err) { console.log(err); }来检查服务器响应。
  • alert(csrftoken) 并在添加断点然后评估 csrftoken 之后;我在 ajax post 方法中得到“M96J3MrtMNvlaXN207faicFwpS9VkOb6”。
  • 并尝试清空缓存。
【解决方案2】:

解决方案:

清空浏览器缓存。上面的代码是正确的。

【讨论】:

    猜你喜欢
    • 2012-10-13
    • 2015-07-30
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2018-11-06
    • 2014-01-25
    • 2019-08-10
    相关资源
    最近更新 更多