【问题标题】:How to obtain csrf token for a python POST request to Django server如何获取对 Django 服务器的 python POST 请求的 csrf 令牌
【发布时间】:2017-06-01 21:15:24
【问题描述】:

如果没有 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"

我做错了什么?

【问题讨论】:

    标签: python django post http-post django-csrf


    【解决方案1】:

    CSRF 令牌是一种客户端到服务器安全功能,可保护您的用户免受跨站点请求伪造。

    你正在做一个服务器到服务器的请求,所以 CSRF 是没用的。您应该考虑删除对 CSRF 的要求,并为您的服务器到服务器的请求使用适当的身份验证方法。

    您可以在您的视图上使用以下装饰器删除 CSRF 令牌验证。

    @csrf_exempt

    https://docs.djangoproject.com/en/dev/_modules/django/views/decorators/csrf/#csrf_exempt

    带有 HTTPS 连接的基于令牌的身份验证方法可能适合您的情况。

    【讨论】:

      【解决方案2】:

      这不是最安全的方法,但您可以在该视图中添加一个装饰器以排除 CSRF 验证,并且您的 POST 不会失败。

      from django.views.decorators.csrf import requires_csrf_token
      
      @requires_csrf_token
      def your_view(request):
          # your code...
      

      仅当您意识到移除 CSRF 验证的风险时,此解决方案才适用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-16
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 2016-08-21
        • 2014-08-10
        • 2021-12-28
        相关资源
        最近更新 更多