【问题标题】: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/                                               

【问题讨论】:

    标签: django django-rest-framework


    【解决方案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 CSRFDRF 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 = [],它在本地对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-16
        • 2022-01-12
        • 2018-02-11
        • 2022-01-26
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 2019-09-24
        相关资源
        最近更新 更多