CSRF令牌传递破坏了我的django视图

时间:2012-12-07 20:41:13

标签: python django fastcgi

当传递X-CSRFToken标头或将POST数据中的csrfmiddlewaretoken发送到我的视图时,它会完全跳过ajax处理程序并直接进入索引/基本视图。

使用Javascript:

$.post("/action/register", {
          name: $('#input_name').val(),
          email: $('#input_email').val(),
          csrfmiddlewaretoken: '{{ csrf_token }}'

        }, function(data) {
          var response;
          try {
            response = JSON.parse(data.toString());  
          } catch(e) {
            response = {"status":"error", "message":"Please try again later, we're having some tech issues!"};
          }

          // ... process some stuff, the callback works which is good

查看:


def handle_register(req):
    ''' Request handler pyfor registration, should return JSON for the AJAX request. '''

    if req.is_ajax():
        return validate_and_register(req)
    else:
        return HttpResponse('{"status":"error","message":"Invalid request."}')

urls.py:


from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^action/register$', 'views.handle_register', name='handle_register'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^.*$', 'views.handle_home', name='handle_home'),
)

当我没有传递标题时,我得到403(CSRF_VERIFICATION_FAILED)。当我传递适当的标题(在多个浏览器中确认)时,它会跳过/ action / register处理程序并直接进入“handle_home”视图。

我被困住了!

2 个答案:

答案 0 :(得分:0)

这可能是由于您的网址上缺少斜杠

  

/动作/寄存器

尝试在网址和javascript中添加斜杠。

另一个猜测是:

  

'views.handle_register'

缺少应用名称?

更安全的是使用反向网址:

from django.core.urlresolvers import reverse

url = reverse('appname.views.handle_register')

$.post(url, {}, func...

答案 1 :(得分:0)

这是nginx的一个问题。根据django / nginx设置文档,我发现我在我的nginx配置中遗漏了这个:


        fastcgi_split_path_info ^()(.*)$;