【问题标题】:"detail": "CSRF Failed: CSRF token missing or incorrect."“detail”:“CSRF 失败:CSRF 令牌丢失或不正确。”
【发布时间】:2014-02-26 22:33:10
【问题描述】:

我正在使用 Tastypie 制作 RESTful API,当我尝试 POST/PUT/DELETE 一个请求时,它说:

“detail”:“CSRF 失败:CSRF 令牌丢失或不正确。”。

GET 可以正常工作。我读过关于 SO 的各种帖子,说:

  • 删除 cookie
  • 或使用@csrf_exempt
  • 或使用@method_decorator(csrf_exempt)

但两者都不起作用。

我怎样才能克服这个错误?

views.py

class SnippetList(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)


    def post(self, request, *args, **kwargs):
        request._dont_enforce_csrf_checks = True
        print request.DATA
        return self.create(request, *args, **kwargs)

serializer.py

from django.forms import widgets
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES


class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

urls.py

from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

urlpatterns = patterns('',
    url(r'^snippets/$', views.SnippetList.as_view()),
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
)

urlpatterns = format_suffix_patterns(urlpatterns)

【问题讨论】:

  • 你试过了吗:csrfexemptmixin
  • 什么是braces模块?
  • 我从 github.com/brack3t/django-braces 安装了 braces 模块并重新运行 POST 请求,它仍然给我同样的错误。
  • 您是否尝试过简单地关注 the instructions 以了解如何对您的请求进行 csrf 保护?我的意思是为什么要如此努力地避免它?
  • @yuvi - 我试过了,但没有任何效果。

标签: django tastypie django-csrf


【解决方案1】:

在 settings.py 中将 rest_framework 默认权限更改为 AllowAny

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',),
...
}

【讨论】:

  • 我将DEFAULT_PERMISSION_CLASSES 设置为rest_framework.permissions.IsAuthenticated,因为我只想允许注册用户访问API。我正在寻找另一种方法来解决这个 CSRF 问题。
  • 同上一条评论
猜你喜欢
  • 2021-10-01
  • 2014-12-25
  • 1970-01-01
  • 2021-06-04
  • 2020-09-19
  • 2021-07-14
  • 2012-05-16
  • 2016-12-31
  • 2017-01-11
相关资源
最近更新 更多