2013-02-10 20 views
5

私はhttp://lightbird.net/dbe/photo.htmlでこの写真オーガナイザーと共有アプリケーションパートIで作業しています。私はサムネイルを生成しようとしています。私はこのエラーが発生します。Djangoエラー(13、 '許可が拒否されました')

私はWindows Vistaを持っています。

IOError at /admin/photo/image/add/ 
    (13, 'Permission denied') 
    Request Method: POST 
    Request URL: http://127.0.0.1:8000/admin/photo/image/add/ 
    Django Version: 1.4.3 
    Exception Type: IOError 
    Exception Value: (13, 'Permission denied') 

    Exception Location:C:\Python26\lib\site-packages\PIL\Image.py in save, line 1399 
    Python Executable:C:\Python26\python.exe 
    Python Version: 2.6.0 
    Python Path: 

    ['C:\\djcode\\mysite', 
    'C:\\Python26\\python26.zip', 
    'C:\\Python26\\DLLs', 
    'C:\\Python26\\lib', 
    'C:\\Python26\\lib\\plat-win', 
    'C:\\Python26\\lib\\lib-tk', 
    'C:\\Python26', 
    'C:\\Python26\\lib\\site-packages', 
    'C:\\Python26\\lib\\site-packages\\PIL'] 

    Server time: Sun, 10 Feb 2013 23:49:34 +1100 

models.py

from django.db import models 
from django.contrib.auth.models import User 
from django.contrib import admin 
from string import join 
from django.core.files import File 
from os.path import join as pjoin 
from tempfile import * 

import os 
from PIL import Image as PImage 
from mysite.settings import MEDIA_ROOT 


class Album(models.Model): 
    title = models.CharField(max_length=60) 
    public = models.BooleanField(default=False) 
    def __unicode__(self): 
     return self.title 

class Tag(models.Model): 
    tag = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.tag 

class Image(models.Model): 
    title = models.CharField(max_length=60, blank=True, null=True) 
    image = models.FileField(upload_to="images/") 
    tags = models.ManyToManyField(Tag, blank=True) 
    albums = models.ManyToManyField(Album, blank=True) 
    created = models.DateTimeField(auto_now_add=True) 
    rating = models.IntegerField(default=50) 
    width = models.IntegerField(blank=True, null=True) 
    height = models.IntegerField(blank=True, null=True) 
    user = models.ForeignKey(User, null=True, blank=True) 
    thumbnail2 = models.ImageField(upload_to="images/", blank=True, null=True) 

    def __unicode__(self): 
     return self.image.name 
    def save(self, *args, **kwargs): 
     """Save image dimensions.""" 
     super(Image, self).save(*args, **kwargs) 
     im = PImage.open(pjoin(MEDIA_ROOT, self.image.name)) 
     self.width, self.height = im.size 

     # large thumbnail 
     fn, ext = os.path.splitext(self.image.name) 
     im.thumbnail((128,128), PImage.ANTIALIAS) 
     thumb_fn = fn + "-thumb2" + ext 
     tf2 = NamedTemporaryFile() 
     im.save(tf2.name, "JPEG") 
     self.thumbnail2.save(thumb_fn, File(open(tf2.name)), save=False) 
     tf2.close() 

     # small thumbnail 
     im.thumbnail((40,40), PImage.ANTIALIAS) 
     thumb_fn = fn + "-thumb" + ext 
     tf = NamedTemporaryFile() 
     im.save(tf.name, "JPEG") 
     self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False) 
     tf.close() 

     super(Image, self).save(*args, ** kwargs) 

    def size(self): 
     """Image size.""" 
     return "%s x %s" % (self.width, self.height) 

    def __unicode__(self): 
     return self.image.name 

    def tags_(self): 
     lst = [x[1] for x in self.tags.values_list()] 
     return str(join(lst, ', ')) 

    def albums_(self): 
     lst = [x[1] for x in self.albums.values_list()] 
     return str(join(lst, ', ')) 

    def thumbnail(self): 
     return """<a href="/media/%s"><img border="0" alt="" src="/media/%s" height="40" /></a>""" % (
                   (self.image.name, self.image.name)) 
    thumbnail.allow_tags = True 
class AlbumAdmin(admin.ModelAdmin): 
    search_fields = ["title"] 
    list_display = ["title"] 

class TagAdmin(admin.ModelAdmin): 
    list_display = ["tag"] 

class ImageAdmin(admin.ModelAdmin): 
    search_fields = ["title"] 
    list_display = ["__unicode__", "title", "user", "rating", "size", "tags_", "albums_","thumbnail", "created"] 
    list_filter = ["tags", "albums"] 
def save_model(self, request, obj, form, change): 
    obj.user = request.user 
    obj.save() 

問題はここです:

from django.core.files import File 
from os.path import join as pjoin 
from tempfile import * 

class Image(models.Model): 
    # ... 

    thumbnail2 = models.ImageField(upload_to="images/", blank=True, null=True) 

def save(self, *args, **kwargs): 
    """Save image dimensions.""" 
    super(Image, self).save(*args, **kwargs) 
    im = PImage.open(pjoin(MEDIA_ROOT, self.image.name)) 
    self.width, self.height = im.size 

    # large thumbnail 
    fn, ext = os.path.splitext(self.image.name) 
    im.thumbnail((128,128), PImage.ANTIALIAS) 
    thumb_fn = fn + "-thumb2" + ext 
    tf2 = NamedTemporaryFile() 
    im.save(tf2.name, "JPEG") 
    self.thumbnail2.save(thumb_fn, File(open(tf2.name)), save=False) 
    tf2.close() 

    # small thumbnail 
    im.thumbnail((40,40), PImage.ANTIALIAS) 
    thumb_fn = fn + "-thumb" + ext 
    tf = NamedTemporaryFile() 
    im.save(tf.name, "JPEG") 
    self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False) 
    tf.close() 

    super(Image, self).save(*args, ** kwargs) 

がどのように私はこのエラーを修正しますか?

+0

かもしれあなたがMEDIA_ROOT' 'に「画像」フォルダを作成したことがありますか? – asermax

答えて

1

djangoには、MEDIA_ROOTフォルダにアクセスするためのアクセス許可がないようです。

あなたのsettings.pyファイルのMEDIA_ROOTの設定を見てください。次に、フォルダのアクセス権(bashシェルからls -lsa /path/to/media_rootのようなもの)をチェックします。 djangoを実行しているユーザがフォルダへの書き込み権限を持っていることを確認してください。

また、asermaxが指摘するように、MEDIA_ROOT内にimagesディレクトリが作成されていることを確認してください。

serving other directories

UPDATE

に特にセクションおそらくそれはthis issueserving static filesのドキュメントを見てください。 im.save(tf2, "JPEG")

+0

私は窓のVistaのATMを使用しています。私はMEDIA_ROOT = 'C:/ djcode/mysite/photo/media'にある自分のメディアフォルダを探し出し、その権限を完全に制御できるようにしました。エラーは引き続き表示されます。何をすべきか? – supersheep1

+0

asermax、これは私のイメージフォルダC:/ djcode/mysite/photo/media ' – supersheep1

+0

であるといいますか?いいえ、あなたのイメージフォルダはC:/ djcode/mysite/photo/media/imagesでなければなりません。あなたはmodels.pyのupload_toパラメータでこのディレクトリに画像をアップロードしていると言ってきました。 Asermaxが正しく指摘しているように、まだ作成していない場合は、フォルダを作成する必要があります。 –

関連する問題