尝试编写脚本将文件上传到 django 项目
Trying to write a script to upload files to a django project
我有一个 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,}
的脚本时(请参阅脚本底部的 response_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)
文件上传正常,文件名显示正确。
我有一个 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,}
的脚本时(请参阅脚本底部的 response_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)
文件上传正常,文件名显示正确。