45

特定の URL のすべての画像を取得してデータベースに保存する Django アプリを作成しています。

しかし、Django で ImageField を使用する方法についてはわかりません。

設定.py

MEDIA_ROOT = os.path.join(PWD, "../downloads/")

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://example.com/media/", "htp://media.example.com/"
MEDIA_URL = '/downloads/'

models.py

class images_data(models.Model):
        image_id =models.IntegerField()
        source_id = models.IntegerField()
        image=models.ImageField(upload_to='images',null=True, blank=True)
        text_ind=models.NullBooleanField()
        prob=models.FloatField()

download_img.py

def spider(site):
        PWD = os.path.dirname(os.path.realpath(__file__ ))
        #site="http://en.wikipedia.org/wiki/Pune"
        hdr= {'User-Agent': 'Mozilla/5.0'}
        outfolder=os.path.join(PWD, "../downloads")
        #outfolder="/home/mayank/Desktop/dreamport/downloads"
        print "MAYANK:"+outfolder
        req = urllib2.Request(site,headers=hdr)
        page = urllib2.urlopen(req)
        soup =bs(page)
        tag_image=soup.findAll("img")
        count=1;
        for image in tag_image:
                print "Image: %(src)s" % image
                filename = image["src"].split("/")[-1]
                outpath = os.path.join(outfolder, filename)
                urlretrieve('http:'+image["src"], outpath)
                im = img(image_id=count,source_id=1,image=outpath,text_ind=None,prob=0)
                im.save()
                count=count+1

次のような1つのビュー内でdownload_imgs.pyを呼び出しています

        if form.is_valid():
                url = form.cleaned_data['url']
                spider(url)
4

8 に答える 8

65

Django のドキュメントは、いつでも開始するのに適した場所です

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

更新しました

したがって、このスクリプトは機能します。

  • 画像をループしてダウンロードする
  • 画像をダウンロード
  • 一時ファイルに保存
  • モデルに適用
  • モデルを保存

.

import requests
import tempfile

from django.core import files

# List of images to download
image_urls = [
    'http://i.thegrindstone.com/wp-content/uploads/2013/01/how-to-get-awesome-back.jpg',
]

for image_url in image_urls:
    # Stream the image from the url
    response = requests.get(image_url, stream=True)

    # Was the request OK?
    if response.status_code != requests.codes.ok:
        # Nope, error handling, skip file etc etc etc
        continue
    
    # Get the filename from the url, used for saving later
    file_name = image_url.split('/')[-1]
    
    # Create a temporary file
    lf = tempfile.NamedTemporaryFile()

    # Read the streamed image in sections
    for block in response.iter_content(1024 * 8):
        
        # If no more file then stop
        if not block:
            break

        # Write image block to temporary file
        lf.write(block)

    # Create the model you want to save the image to
    image = Image()

    # Save the temporary image to the model#
    # This saves the model so be sure that it is valid
    image.image.save(file_name, files.File(lf))

いくつかの参照リンク:

  1. requests - 「HTTP for Humans」、urllib2 よりもこれを好みます
  2. tempfile - ディスクではなく一時ファイルを保存します
  3. Django ファイルフィールドの保存
于 2013-04-23T16:49:05.010 に答える
2

私があなたが求めていると思うものの例として:

forms.py で:

imgfile = forms.ImageField(label = 'Choose your image', help_text = 'The image should be cool.')

models.py で:

imgfile =   models.ImageField(upload_to='images/%m/%d')

そのため、ユーザーからの POST 要求があります (ユーザーがフォームに入力したとき)。そのリクエストには、基本的にデータの辞書が含まれます。ディクショナリには、送信されたファイルが保持されます。フィールド (この場合は ImageField) からのファイルにリクエストを集中するには、次を使用します。

request.FILES['imgfield']

モデルオブジェクトを構築するとき(モデルクラスをインスタンス化するとき)にそれを使用します:

newPic = ImageModel(imgfile = request.FILES['imgfile'])

これを簡単な方法で保存するには、オブジェクトに付与された save() メソッドを使用するだけです (Django は素晴らしいので)。

if form.is_valid():
    newPic = Pic(imgfile = request.FILES['imgfile'])
    newPic.save()

デフォルトでは、画像は settings.py で MEDIA_ROOT に指定したディレクトリに保存されます。

テンプレート内の画像へのアクセス:

<img src="{{ MEDIA_URL }}{{ image.imgfile.name }}"></img>

URL は扱いにくい場合がありますが、保存された画像を呼び出すための単純な URL パターンの基本的な例を次に示します。

urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),
   )

お役に立てば幸いです。

于 2013-04-23T18:47:53.317 に答える
0

画像にパスを割り当てる代わりに、このようにしてみてください...

    import urllib2
    from django.core.files.temp import NamedTemporaryFile
    def handle_upload_url_file(url):
        img_temp = NamedTemporaryFile()
        opener = urllib2.build_opener()
        opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1')]
        img_temp.write(opener.open(url).read())
        img_temp.flush()
        return img_temp

上記の関数をこのように使用します..

    new_image = images_data()
    #rest of the data in new_image and then do this.
    new_image.image.save(slug_filename,File(handle_upload_url_file(url)))
    #here slug_filename is just filename that you want to save the file with.
于 2013-04-23T19:48:12.823 に答える