为啥我在 POST 到 Django REST 框架时得到“CSRF cookie not set”?

Posted

技术标签:

【中文标题】为啥我在 POST 到 Django REST 框架时得到“CSRF cookie not set”?【英文标题】:Why do I get "CSRF cookie not set" when POST to Django REST framework?为什么我在 POST 到 Django REST 框架时得到“CSRF cookie not set”? 【发布时间】:2014-05-13 19:28:05 【问题描述】:

我在尝试使用 Django REST 框架发布到一个简单的测试应用程序时收到错误“CSRF cookie not set”。我已经用 Django 1.4 和 Django 1.6.2 进行了尝试。我正在使用 Django REST 框架 v 2.3.13。

我尝试过使用 @csrf_exempt 装饰器,但没有帮助。

这是一个非常简单的应用程序,无需用户注册/登录等。

知道为什么我会收到此错误吗?

更新:我已经更新了我的 urls.py,如下所示,它现在可以工作了!!

这是我的代码:

urls.py

from django.conf.urls import patterns, url

from quickstart import views

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

views.py

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['POST'])
def api_add(request):
    return Response("test": 'abc')

settings.py

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',                                               
    'rest_framework',
)

post.sh

curl -X POST -H "Content-Type: application/json" -d '

    "name": "Manager",
    "description": "someone who manages"
' http://127.0.0.1:8000/api_add/                                               

【问题讨论】:

【参考方案1】:

使用@csrf_exempt-装饰器:

from django.views.decorators.csrf import csrf_exempt

@api_view(['POST'])
@csrf_exempt
def api_add(request):
    return Response("test": 'abc')

更新: 如果您永远不需要csrf-checks,请删除中间件。在settings.py 中搜索MIDDLEWARE_CLASSES 并删除'django.middleware.csrf.CsrfViewMiddleware',

【讨论】:

在发布我的问题之前我已经尝试过了。我应该说。我仍然遇到同样的错误。 我不想关闭 CSRF 保护,因为我将让一些用户通过 Web 浏览器发布表单,而我希望为他们提供 CSRF 保护。我设法通过更新我的 urls.py... @smithy:准确解释您所做更改的答案会很有帮助:)【参考方案2】:

Django-Rest-Framework automatically adds @csrf_exempt to all APIView (or @api_view)。

唯一的例外是 SesssionAuthentication 它会强制您(正确地)使用 CSRF,请参阅 docs on CSRF 或 DRF source

【讨论】:

好的,但我认为我没有使用 SessionAuthentication,为什么会出现错误?【参考方案3】:

我是这样解决的:

@api_view(['POST'])
@csrf_exempt
def add(request):
   ....

到:

@csrf_exempt
@api_view(['POST'])
def add(request):
   .....

【讨论】:

【参考方案4】:

我有类似的问题。我尝试使用@csrf_exempt,但没有成功。

我将ALLOWED_HOSTS = '*' 更改为ALLOWED_HOSTS = [],它在本地对我有用。

【讨论】:

以上是关于为啥我在 POST 到 Django REST 框架时得到“CSRF cookie not set”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 django-rest-framework 时不需要 `csrf_exempt`?

为啥我在 Django 收到 403 POST 请求错误?

无法发布到 Django REST API

Android 如何 POST 到 Django Rest Framework Json 或 API?

Django-Rest-Framework POST 对象字段必填

Django Rest:为啥访问被拒绝,尽管 AccessAny 被设置为权限?