我有一个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')
这是视图函数的样子:
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
new_file = form.save()
现在我希望有一个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)
如何使用python脚本将POSTES方法添加到POST请求以上传文件?我还尝试编写一个不使用表单的不同视图函数,但它也没有工作。
答案 0 :(得分:4)
要查看您的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>
仅使用stdlib以编程方式复制它。{/ 3}。
要将文件上传为multipart/form-data
,您可以使用complicated:
import requests
response = requests.post(upload_file_url,
files={'filename': open(uploadfile,'rb'),
'description': 'upload test'})
print response.content
或urllib2
和requests
library图书馆:
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()
答案 1 :(得分:0)
不是那么容易,不是request
没有FILES
方法(这不是方法,而是字典)。问题是如果请求没有Content-Type:multipart/form-data
,Django不会识别文件。
请注意,如果请求方法是POST,则FILES将仅包含数据,并且发布到请求的文件包含enctype =“multipart / form-data”。否则,FILES将是一个空白的字典对象。
您可以在此处查看类似的请求:What should a Multipart HTTP request with multiple files look like?
https://docs.djangoproject.com/en/dev/ref/request-response/
所以基本上你要做的就是将这个字段添加到你正在构建的请求中,然后将它发送到django。
您可以从django的doc查看这些页面以获取更多信息,如果您可以在将请求发送到django之前嗅探或查看请求,这将是非常好的,这样您就可以知道遗漏了什么。
https://docs.djangoproject.com/en/dev/ref/forms/api/
由于没有简单/直接的答案,我希望这可以让你朝着正确的方向前进。
祝你好运!