Я делаю приложение Pyqt5
и сейчас пытаюсь заставить его опубликовать файл на моем сайте django одним нажатием кнопки. Я могу выполнить сценарий входа на свой сайт, используя requests
без проблем (используя csrftoken), но при загрузке файла (в "http://127.0.0.1:8000/ranking") он вызывает 403 Forbidden Error (" CSRF "). cookie не установлен. ") хотя я отправил csrftoken с файлом.
Вот код:
send_file.py
import requests
login_url = "http://127.0.0.1:8000/accounts/login/"
MAX_RETRIES = 2
client = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries=MAX_RETRIES)
client.mount('http://', adapter) # I know that I should use https, but the server doesn't have it yet
client.get(login_url) # Goes to login page
csrftoken = client.cookies['csrftoken'] # get csrf token
login_data = {'username': 'b','password':'senha123', 'csrfmiddlewaretoken': csrftoken}
try:
response = client.post(login_url, data=login_data) # executes login
if "Logout from b" in str(response.content): # this is to confirm the user logged in
print("Logged in at {}".format(response.url)) # "Logged in at http://127.0.0.1:8000/home/"
response2 = client.get('http://127.0.0.1:8000/ranking/') # Goes to the uploading page
print("Logged in at {}".format(response2.url)) # "Logged in at http://127.0.0.1:8000/ranking/"
csrftoken1 = client.cookies['csrftoken'] # get another crsf token
file_data = {'csrfmiddlewaretoken': csrftoken1}
headers = {"Referer": 'http://127.0.0.1:8000/ranking/'}
print(csrftoken, csrftoken1) # Both are different
with open('Data\\training_data.npy', 'rb') as f:
r = requests.post('http://127.0.0.1:8000/ranking/', files={'training_data.npy': f}, data=file_data, headers=headers)
print("File should be sent")
print(r.text) # 403 Forbidden -> CSRF verification failed. Request aborted.
else:
print("not logged in")
except Exception as e:
print(e) # No errors raised
Если вам нужно посмотреть модели, шаблоны или что-либо, связанное с веб-сайтом django: ссылка