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

У меня есть проект django 3.x, в котором я могу загружать несколько файлов и связанные с ними данные формы через страницы администратора в модель под названием Document. Однако мне нужно загрузить большое количество файлов, поэтому я написал небольшой скрипт на 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,} (см. ответ_1 внизу скрипта), файлы загружаются правильно, за исключением того, что имя файла "storage_file_name", а не "20047_Phillips_Photo_052_002.jpg" (то есть storage_file_name.name = "storage_file_name").

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

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

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

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

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

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

Вернуться на верх