0

假设我有以下模型定义:

class Image(models.Model):
    image = models.ImageField(upload_to='images')

现在进一步假设我想获取远程 URL 的内容并在上面的模型中插入一行。以这张图片为例:

https://www.python.org/images/python-logo.gif

我从以下代码开始:

from tempfile import NamedTemporaryFile

fn = 'https://www.python.org/images/python-logo.gif'

# Read the contents into the temporary file.
f = NamedTemporaryFile()
f.name = fn
f.write(urlopen(fn).read())
f.flush()

# Create the row and save it.
r = Image(image=File(f))
r.save()

我认为这不应该起作用。经过一番调试,我发现:

  • 远程图像被正确下载并存储在临时文件中
  • 该文件在MEDIA_ROOT目录中创建,但大小为 0
  • 该行未保存,但未引发异常!

任何人都可以阐明这里发生了什么吗?我究竟做错了什么?有没有更简单的方法来做到这一点?

如果有帮助,我正在 Linux 上运行 Django 1.4。

4

1 回答 1

1

你确定没有例外?当我尝试这个时,我得到AttributeError: Unable to determine the file's size. 这可能是由f.name = fn. 无法测量没有实际路径(fn 是 URL)的文件。将 f.name 恢复为其原始值可以解决您的两个问题。

如果要显式设置新文件的名称,请使用:

newfile = File(f,name='python-logo.gif')
r=Image(image=newfile)
r.save()
newfile.close()

(额外的行是因为 File 对象不会自动关闭)

于 2012-11-12T19:26:40.167 回答