Tastypie csrftoken未设置为隐身模式

时间:2013-09-01 09:46:46

标签: csrf tastypie incognito-mode

我对一个瘦的tastypie层使用ajax调用到CRUD(使用csrf标记)。在我运行网站之前,一切都像魅力一样Chrome隐身模式。我一直在收到关于CUD请求的401。

查看请求cookie我发现sessionid cookie已设置,但csrftoken cookie未设置(如果我以正常模式运行,则设置正确)。

settings.py我有:

MIDDLEWARE_CLASSES = (
  'django.middleware.common.CommonMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.csrf.CsrfViewMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
 )

任何人遇到这个问题都可以节省我一些时间吗?

非常感谢,  尔根

1 个答案:

答案 0 :(得分:3)

我发现在Django的中间件文件csrf.py中没有设置cookie的原因。在隐身模式下,if下方的代码会启动,阻止设置Cookie:

    if not request.META.get("CSRF_COOKIE_USED", False):
        return response

我的解决方法是手动为tastypie的api.py文件中的ModelResources设置此值:

class MyModelResource( ModelResource ) :

    [..]

    def wrap_view(self, view):
         def wrapper(request, *args, **kwargs):
             request.META["CSRF_COOKIE_USED"] = True
             wrapped_view = super(MyModelResource, self).wrap_view(view)
             return wrapped_view(request, *args, **kwargs)
         return wrapper