csrf_exempt 设置但 CSRF 失败:Referer 检查失败 - 没有 Referer

问题描述

我有一个后端 API,它在 django 中并部署在 Google Endpoint 上。 我有一个将数据插入到我的数据库的发布请求。

我创建了一个脚本来使用此端点,但出现此错误

{"detail":"CSRF 失败:Referer 检查失败 - 没有 Referer。"}

关于帖子,我在班级中添加了 crsf_exempt 装饰器,但它没有改变。
我尝试通过两种方式添加装饰器:

class AddUser(APIView):
    """ Create user and company from csv """

    @method_decorator(csrf_exempt)
    def post(self,request):


@method_decorator(csrf_exempt,name='dispatch')
class AddUser(APIView):
    """ Create user and company from csv """

    def post(self,request):

但都失败了。

这是我联系端点的方式:

resp = requests.request(
    method,url,headers={'Authorization': 'Bearer {}'.format(
        open_id_connect_token)},**kwargs)

有什么想法吗? 谢谢


编辑

所以我尝试将身份验证类添加到我的视图中,但这似乎是一个坏主意。这对我来说真是麻烦。

我试图让 csrftoken 这样做:

        client = requests.session()
        # Retrieve the CSRF token first
        client.get(url)  # sets cookie
        print(client.cookies)
        if 'csrftoken' in client.cookies:
            # Django 1.6 and up
            csrftoken = client.cookies['csrftoken']
        else:
            # older versions
            csrftoken = client.cookies

事情是,我使用 IAP 来保护我的 API,我没有任何 csrftoken cookie,但我确实有一个看起来像这样的东西:

如何使用它向我的 API 发出发布请求?

解决方法

所以这发生在我身上,因为我没有为我的通用视图设置任何authentication_classes
如果未设置此选项,Django 将自动使用 SessionBackend,这需要 csrf 令牌。
我通过将其添加到我的视图中来修复它:authentication_classes = [ModelBackend,GoogleOAuth2]

,

@Kimor - 你能在你的 urls.py 中尝试这样做吗

 from django.views.decorators.csrf import csrf_exempt

url('^test/$',csrf_exempt(views.TestView.as_view())),

APIView 类上定义的 get 和 post 方法只是告诉 DRF 实际视图应该如何表现,但 Django 路由器期望的视图方法实际上并没有实例化,直到您调用 TestView.as_view()。

  • 来源

Django REST Framework CSRF Failed: CSRF cookie not set