我有一个web应用程序,我需要做一些API级别的测试。我能够在curl命令中发出Django Post请求API调用,如下所示:
curl 'https://my-server.com/blablabla/api/public/v1/profiles'
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0'
-H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' --compressed
-H 'Referer: https://my-server.com/blablabla/api/public/v1/profiles'
-H 'X-CSRFToken: ...'
-H 'Connection: keep-alive'
-H 'Cookie: csrftoken=...; sessionid=...'
-H 'Content-Type: application/json'
--data-binary '{"group":"1","name":"XYZ"}'但是,如果我试图按以下方式将类似的代码移植到python3中:
#!/usr/bin/python3
import requests
import json
TOKEN = 'X-CSRFToken: ...'
COOKIE = 'Cookie: ...; sessionid=...'
headers = {'X-CSRFToken': TOKEN, 'Cookie': COOKIE}
post_data = '{"group":"1","name":"XYZ"}'
response = requests.put("https://my-server.com/blablabla/api/public/v1/profiles", data=post_data, headers=headers)
print(response.json())
print(response.ok)
print(response.status_code)我得到了如此失败的回报,
{'msg': ['CSRF Failed: CSRF cookie not set.']}
False
403有人知道会出什么问题吗?
发布于 2020-12-04 02:15:11
您需要在请求中包含一个CSRF令牌(来自django),但是看起来您正在尝试包含一个令牌。
如果没有正确配置某些内容,Django就不接受令牌,我遇到了一些问题。造成这种情况的原因有很多,比如设置错误的SESSION_COOKIE_DOMAIN、CSRF_COOKIE_NAME或CSRF_COOKIE_DOMAIN (如果您要更改这些)。
它也可以是CSRF_COOKIE_SECURE或SESSION_COOKIE_SECURE设置之一。这两个示例都表明您正在使用HTTPS,因此应该将它们都设置为True。我记得在本地主机上调试时,我需要将它们设置为False,以便在HTTP上工作
查看Django配置文档以获得以下有用信息:https://docs.djangoproject.com/en/3.1/ref/settings/#session-cookie-secure
如果启用了CORS设置,也可以查看CORS设置。确保CORS_ALLOW_CREDENTIALS是真的。下面是一个描述CORS设置的链接,如果您正在使用它们:https://pypi.org/project/django-cors-headers/
也有可能有一个简单得多的解决方案。curl请求是GET,但是看起来Python代码正在执行PUT,这在CSRF中是完全不同的(GET并不真正关心它,但是PUT做的非常多)。因此,有一个问题可能是--您是尝试执行GET还是PUT到端点?
https://stackoverflow.com/questions/65132719
复制相似问题