Попытка написать скрипт для загрузки файлов в проект 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)
загрузка файла работает и имя файла отображается правильно.