我经常使用测试我的应用程序curl
,过去我不得不简单地用csrf_exempt
. 我真的不想这样做,因为我有一种讨厌的感觉,我会忘记在部署中这样做并享受一生的 CSRF 地狱。
有没有办法让我使用 Django 的 shell 命令请求 CSRF 令牌?我想获得一个令牌,我可以将我的请求与我的curl
请求一起发送以安全地测试事物。
我经常使用测试我的应用程序curl
,过去我不得不简单地用csrf_exempt
. 我真的不想这样做,因为我有一种讨厌的感觉,我会忘记在部署中这样做并享受一生的 CSRF 地狱。
有没有办法让我使用 Django 的 shell 命令请求 CSRF 令牌?我想获得一个令牌,我可以将我的请求与我的curl
请求一起发送以安全地测试事物。
向表单 URL 发出初始 GET 请求以填充 cookie jar:
$ curl http://example.com/some-form/ -o /dev/null -c cookies.txt -s
获取csrftoken
cookie 的值:
$ grep csrftoken cookies.txt | cut -f 7
YQkfXZCKtPP0hC30NmH10jSWuf6yJA5E
发出 POST 时,只需包含csrfmiddlewaretoken
具有此值的字段(并使用相同的 cookie jar)。
requests
我使用相同的技巧使用该库编写端到端测试。
你可以这样做
from django.middleware.csrf import _get_new_csrf_key()
request.META["CSRF_COOKIE"] = _get_new_csrf_key()
在处理与此相关的问题时,我想测试为一组可通过 AJAX 访问的端点设置 CSRF 令牌。我遇到了这个线程,并认为从 Django shell 添加另一种方法可能是值得的,这就是原始发帖人似乎在问的问题。
首先,我正在使用requests
图书馆,所以如果你没有它,你必须这样做pip install requests
。
确保令牌存在
接下来,如果只处理 Ajax 端点,我们需要某种方式来检索令牌,因此您的视图的 get 方法必须具有以下装饰器集,因为如 Django 文档中所述,如果您是动态生成表单。这是一个基于类的视图示例:
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie
@method_decorator(ensure_csrf_cookie)
def get(self, request, *args, **kwargs):
return SomeJson...
DRF 帖子:确保 csrf_protect
我也在使用 Django Rest Framework 视图,所以我必须csrf_protect
在我的 POST 上明确设置:
from django.views.decorators.csrf import csrf_protect
@method_decorator(ensure_csrf_cookie)
def post(self, request, *args, **kwargs):
return SomeJson...
从 shell 中检索令牌并将其返回
最后,为了从方法中获取令牌get
并将其 POST 回post
方法,我执行了以下操作:
>>> resp = requests.get(url)
>>> cookies = resp.cookies
>>> token = cookies['csrftoken']
>>> data = {'content': True, 'we': None, 'are': False, 'posting': 0}
>>> data['csrfmiddlewaretoken'] = token
>>> resp2 = requests.post(url, data=data, cookies=cookies)
>>> resp2
<Response [200]>