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 に答える