如何为 Django 服务器的 python POST 请求获取 csrf 令牌
How to obtain csrf token for a python POST request to Django server
如果没有 csrf 令牌,我将收到 403 响应,所以看起来我需要它。我目前正在尝试这样做:
import requests
import sys
URL = 'http://127.0.0.1:8000/toasterinfo'
client = requests.session()
# Retrieve the CSRF token first
client.get(URL) # sets cookie
csrftoken = client.cookies['csrf']
r = client.post(URL, data={'number': 12524,
'type': 'issue', 'action': 'show', "csrfmiddlewaretoken": csrftoken}, headers=dict(Referer=URL))
print(r)
但我收到错误消息:
Traceback (most recent call last):
File "django_client.py", line 10, in <module>
csrftoken = client.cookies['csrftoken']
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/cookies.py", line 327, in __getitem__
return self._find_no_duplicates(name)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/cookies.py", line 398, in _find_no_duplicates
raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
KeyError: "name='csrftoken', domain=None, path=None"
我做错了什么?
这不是最安全的方法,但您可以向该视图添加装饰器以排除 CSRF 验证,并且您的 POST 不会失败。
from django.views.decorators.csrf import requires_csrf_token
@requires_csrf_token
def your_view(request):
# your code...
此解决方案仅适用于您了解删除 CSRF 验证的风险的情况。
CSRF 令牌是一种客户端到服务器 的安全功能,可保护您的用户免受跨站点请求伪造。
您正在进行服务器到服务器请求,因此 CSRF 无用。您应该考虑删除对 CSRF 的要求,并为您的服务器到服务器请求使用适当的身份验证方法。
您可以删除在您的视图中使用以下装饰器的 CSRF 令牌验证。
@csrf_exempt
见https://docs.djangoproject.com/en/dev/_modules/django/views/decorators/csrf/#csrf_exempt
具有 HTTPS 连接的基于令牌的身份验证方法可能适合您的情况。
如果没有 csrf 令牌,我将收到 403 响应,所以看起来我需要它。我目前正在尝试这样做:
import requests
import sys
URL = 'http://127.0.0.1:8000/toasterinfo'
client = requests.session()
# Retrieve the CSRF token first
client.get(URL) # sets cookie
csrftoken = client.cookies['csrf']
r = client.post(URL, data={'number': 12524,
'type': 'issue', 'action': 'show', "csrfmiddlewaretoken": csrftoken}, headers=dict(Referer=URL))
print(r)
但我收到错误消息:
Traceback (most recent call last):
File "django_client.py", line 10, in <module>
csrftoken = client.cookies['csrftoken']
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/cookies.py", line 327, in __getitem__
return self._find_no_duplicates(name)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/cookies.py", line 398, in _find_no_duplicates
raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
KeyError: "name='csrftoken', domain=None, path=None"
我做错了什么?
这不是最安全的方法,但您可以向该视图添加装饰器以排除 CSRF 验证,并且您的 POST 不会失败。
from django.views.decorators.csrf import requires_csrf_token
@requires_csrf_token
def your_view(request):
# your code...
此解决方案仅适用于您了解删除 CSRF 验证的风险的情况。
CSRF 令牌是一种客户端到服务器 的安全功能,可保护您的用户免受跨站点请求伪造。
您正在进行服务器到服务器请求,因此 CSRF 无用。您应该考虑删除对 CSRF 的要求,并为您的服务器到服务器请求使用适当的身份验证方法。
您可以删除在您的视图中使用以下装饰器的 CSRF 令牌验证。
@csrf_exempt
见https://docs.djangoproject.com/en/dev/_modules/django/views/decorators/csrf/#csrf_exempt
具有 HTTPS 连接的基于令牌的身份验证方法可能适合您的情况。