Mig*_*rro 1 python django urllib urllib2
我有一个 django 文件模型,它有一个 models.FileField 字段和一个用于将文件上传到服务器的表单:
class UploadFile(model.Model):
filename = models.FileField(upload_to='uploads')
description = models.CharField(max_length=38, blank=True)
class UploadFileForm(ModelForm):
class Meta:
model = UploadFile
fields = ('filename', 'description')
Run Code Online (Sandbox Code Playgroud)
视图函数如下所示:
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
new_file = form.save()
Run Code Online (Sandbox Code Playgroud)
现在我想要一个仅使用标准库的 python 脚本,使用上面的视图函数将文件上传到 UploadFile 模型。但是,此代码不起作用,因为 POST 请求没有 FILES 方法。
import urllib, urllib2
data = urllib.urlencode({'filename': open(uploadfile, "rb"),
'description': 'upload test'})
post_req = urllib2.Request(upload_file_url, data)
result = urllib2.urlopen(post_req)
Run Code Online (Sandbox Code Playgroud)
如何将 FILES 方法添加到 POST 请求以使用 python 脚本上传文件?我还尝试编写一个不使用表单的不同视图函数,但它也不起作用。
要查看 django 视图是否有效,您可以使用浏览器进行测试:
<FORM action="{{ upload_file_url }}"
enctype="multipart/form-data"
method="POST">
Description: <INPUT type="text" name="description" value="upload test"><BR>
File to upload: <INPUT type="file" name="filename"><BR>
<INPUT type="submit" value="Send">
</FORM>
Run Code Online (Sandbox Code Playgroud)
仅使用 stdlib 以编程方式复制它很复杂。
要上传文件,multipart/form-data您可以使用requests库:
import requests
response = requests.post(upload_file_url,
files={'filename': open(uploadfile,'rb'),
'description': 'upload test'})
print response.content
Run Code Online (Sandbox Code Playgroud)
或者urllib2和poster库:
import urllib2
import poster.encode
import poster.streaminghttp
opener = poster.streaminghttp.register_openers()
params = {'filename': open(uploadfile,'rb'), 'description': 'upload test'}
datagen, headers = poster.encode.multipart_encode(params)
response = opener.open(urllib2.Request(upload_file_url, datagen, headers))
print response.read()
Run Code Online (Sandbox Code Playgroud)