为啥我在 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`?
Android 如何 POST 到 Django Rest Framework Json 或 API?