问题描述
我有一个后端 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()。
- 来源