Python 将带有urllib的文件上载到Django中的文件字段模型

Python 将带有urllib的文件上载到Django中的文件字段模型,python,django,urllib2,urllib,Python,Django,Urllib2,Urllib,我有一个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

我有一个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')
以下是view函数的外观:

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            new_file = form.save()
现在我想要一个python脚本,它只使用标准库,使用上面的view函数将文件上传到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)

如何在POST请求中添加FILES方法以使用python脚本上载文件?我还尝试编写一个不同的视图函数,它不使用表单,但也不起作用。

这不是那么容易,不是因为
请求
没有
文件
方法(不是方法,是字典)。问题是,如果请求没有
内容类型:multipart/form data
,Django就无法识别文件

请注意,仅当请求方法为POST且发送到请求的方法具有enctype=“multipart/form data”时,文件才会包含数据。否则,文件将是一个类似于字典的空白对象

在这里,您可以看到这样的请求是什么样子的:

因此,基本上您需要做的是将该字段添加到您正在构建的请求中,然后将其发送给django

您可以从django的文档中查看此页面以获得更多信息,如果您可以在将请求发送到django之前嗅探或查看请求的状态,这样您就可以知道缺少了什么,这将是非常棒的

由于没有一个简单/直接的答案,我希望这能帮你找到正确的方向


祝你好运

这不是那么容易,不是因为
请求
没有
文件
方法(不是方法,而是字典)。问题是,如果请求没有
内容类型:multipart/form data
,Django就无法识别文件

请注意,仅当请求方法为POST且发送到请求的方法具有enctype=“multipart/form data”时,文件才会包含数据。否则,文件将是一个类似于字典的空白对象

在这里,您可以看到这样的请求是什么样子的:

因此,基本上您需要做的是将该字段添加到您正在构建的请求中,然后将其发送给django

您可以从django的文档中查看此页面以获得更多信息,如果您可以在将请求发送到django之前嗅探或查看请求的状态,这样您就可以知道缺少了什么,这将是非常棒的

由于没有一个简单/直接的答案,我希望这能帮你找到正确的方向


祝你好运

要查看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>
urllib2
和库:

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()

要查看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>
urllib2
和库:

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()

我想我不知道如何将文件添加到使用urllib2Ok创建的请求中,您不必将
文件
字典添加到请求中。您必须正确地符合请求,当Django解析它时,它将自己填充
request.FILES
字典。我想我不知道如何将文件添加到使用urllib2Ok创建的请求中,您不必将
FILES
字典添加到请求中。您必须正确地符合请求,当Django解析它时,它将自行填充
request.FILES
字典。我将使用scp复制文件,直到我可以获得有关此问题的帮助。我将使用scp复制文件,直到我可以获得有关此问题的帮助,我将来可能不得不使用请求库。目前,我正在使用urllib.urlencode对postscript文件进行编码,因为这是我所需要的全部,但它不适用于二进制文件…@MigueldeVal Borro:urlencode()创建x-www-form-urlencoded数据,但django的文件字段需要多部分/表单数据。它不应该适用于任何文件。您的视图与我发布的html表单一起工作吗?@JF Sebastian是的,我有一个类似的表单可以工作。我还需要对stdlib做同样的事情,所以我发送类似于
urllib.urlencode({“filename”:“plot.ps”,“data”:f.read(),“description”:“testupload”})的内容
并定义一个视图函数,将数据存储在模型中,并将文件存储在磁盘上。@MigueldeVal Borro:如果您不能安装任何依赖项,则只需将poster的源代码添加到您的软件包中即可(它是且不需要其他依赖项)。别忘了关闭
上载文件
文件?谢谢,我将来可能不得不使用请求库。目前,我正在使用urllib.urlencode对postscript文件进行编码,因为这是我所需要的全部,但它不适用于二进制文件…@MigueldeVal Borro:urlencode()创建x-www-form-urlencoded数据,但django的文件字段需要多部分/表单数据。它不应该适用于任何文件。您的视图与我发布的html表单一起工作吗?@JF Sebastian是的,我有一个类似的表单可以工作。我还需要对stdlib做同样的事情,所以我发送类似于
urllib.urlencode({“filename”:“plot.ps”,“data”:f.read(),“description”:“testupload”})的内容
并定义一个视图函数,用于存储模型中的数据和磁盘上的文件。@MigueldeVal Borro:如果您无法安装任何依赖项,则只需将poster的源代码添加到您的包中(它是并且不需要其他依赖项)。别忘了关闭
上载文件
文件?