Как отправить файлы на сайт после входа в другой URL? - PullRequest
0 голосов
/ 27 апреля 2018

Я делаю приложение 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: ссылка

1 Ответ

0 голосов
/ 27 апреля 2018

Запрос на отправку, отправляющий файлы, использует другой сеанс с другими запросами, requests.post, и поэтому файл cookie не будет установлен.

Вместо этого попробуйте client.post:

r = client.post('http://127.0.0.1:8000/ranking/', files={'training_data.npy': f}, data=file_data, headers=headers)
...