簡體   English   中英

如何為到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令牌是服務器到服務器安全性的客戶端,可保護您的用戶免受跨站點請求偽造的侵害。

您正在執行服務器到服務器的請求,因此CSRF沒有用。 您應該考慮刪除CSRF的要求,並對服務器到服務器的請求使用正確的身份驗證方法。

您可以在視圖上使用以下修飾符刪除CSRF令牌驗證。

@csrf_exempt

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

具有HTTPS連接的基於令牌的身份驗證方法可能適合您的情況。

這不是最安全的方法,但是您可以在該視圖中添加裝飾器以排除CSRF驗證,並且POST不會失敗。

from django.views.decorators.csrf import requires_csrf_token

@requires_csrf_token
def your_view(request):
    # your code...

僅當您知道刪除CSRF驗證的風險時,此解決方案才適用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM