Попытка написать скрипт для загрузки файлов в проект django

#django #django-models #django-admin

#джанго #джанго-модели #джанго-администратор

Вопрос:

У меня есть проект django 3.x, в котором я могу загружать несколько файлов и связанные с ними данные формы через страницы администратора в модель под названием Документ. Однако мне нужно загрузить большое количество файлов, поэтому я написал небольшой скрипт на python, чтобы автоматизировать этот процесс.

У меня есть одна проблема со сценарием. Кажется, я не могу установить имя файла так, как оно задано при загрузке через страницу администратора.

Вот сценарий…У меня было несколько проблем с правильной работой токена csrf, поэтому для этого может быть какой-то избыточный код.

 import requests # Set up the urls to login to the admin pages and access the correct add page URL1='http://localhost:8000/admin/' URL2='http://localhost:8000/admin/login/?next=/admin/' URL3 = 'http://localhost:8090/admin/memorabilia/document/add/' USER='admin' PASSWORD='xxxxxxxxxxxxx' client = requests.session()  # Retrieve the CSRF token first client.get(URL1) # sets the cookie csrftoken = client.cookies['csrftoken']  print("csrftoken1=%s" % csrftoken)  login_data = dict(username=USER, password=PASSWORD, csrfmiddlewaretoken=csrftoken) r = client.post(URL2, data=login_data, headers={"Referer": "foo"})   r = client.get(URL3)  csrftoken = client.cookies['csrftoken'] print("csrftoken2=%s" % csrftoken)  cookies = dict(csrftoken= csrftoken)  headers = {'X-CSRFToken': csrftoken}  file_path = "/media/mark/ea00fd8e-4330-4d76-81d8-8fe7dde2cb95/2017/Memorable/20047/Still Images/Photos/20047_Phillips_Photo_052_002.jpg"  data = {  "csrfmiddlewaretoken": csrftoken,  "documentType_id": '1',  "rotation" : '0',  "TBD": '350',  "Title": "A test title",  "Period": "353",  "Source Folder": '258',  "Decade": "168",  "Location": "352",  "Photo Type": "354",  }   file_data = None with open(file_path ,'rb') as fr:  file_data = fr.read()  # storage_file_name is the name of the FileField in the Document model.  #response_1 = requests.post(url=URL3, data=data, files={'storage_file_name': file_data,}, cookies=cookies) response_2 = client.post(url=URL3, data=data, files={'storage_file_name': file_data, 'name': "20047_Phillips_Photo_052_002.jpg"}, cookies=cookies,)  

Когда я загружаю файл с помощью страницы администратора, имя файла «20047_Phillips_Photo_052_002.jpg», как и должно быть (т. е. storage_file_name.name = 20047_Phillips_Photo_052_002.jpg).

Когда я запускаю скрипт с помощью files={'storage_file_name': file_data,} (см. response_1 в нижней части сценария), файлы загружаются правильно, за исключением того, что имя файла «имя_файла хранилища», а не «20047_Phillips_Photo_052_002.jpg» (т. е. storage_file_name.name = «имя файла хранилища»).

Когда я загружаю, используя files={'storage_file_name': file_data, 'name': "20047_Phillips_Photo_052_002.jpg"} имя файла, все еще «имя файла хранилища» (т. Е. storage_file_name.name = «имя файла хранилища»).

Я заглянул в запрос.Объект FILES при загрузке файла через страницу администратора, и поле _name для каждого объекта-это имя загружаемого файла. В документации к файловому объекту django говорится, что у него есть поле под названием name .

Чего мне не хватает, чтобы мой скрипт загружал файл так же, как это делает страница администратора? Под этим я подразумеваю, что имя файла не является «именем файла хранилища».

Ответ №1:

Когда я изменю последнее response= line на

response = client.post(url=URL3, data=metadata, files= {'storage_file_name': open(file_path ,'rb'),}, cookies=cookies, headers=headers)

загрузка файла работает, и имя файла отображается правильно.