2013-02-10 35 views
5

Bu Fotoğraf Düzenleyici ve Paylaşım App Part I'de http://lightbird.net/dbe/photo.html adresinde çalışıyorum. Küçük resim oluşturmaya çalışıyorum ve yaptığım zaman. Bu hatayı alıyorum.Django Hatası (13, 'İzin reddedildi')

Windows Vista kullanıyorum.

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 

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

sorun burada geçerli:

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) 

Nasıl bu hatayı düzeltebilirim?

+0

Eğer 'MEDIA_ROOT' üzerinde 'resim' klasörü oluşturdunuz çözüm olabilir? – asermax

cevap

1

Django, MEDIA_ROOT klasörüne erişmek için ihtiyaç duyduğu izinlere sahip değil gibi görünüyor.

Ayarlarınızdaki MEDIA_ROOT ayarlarına bir göz atın. Sonra klasördeki izinleri kontrol edin (bir bash kabuğundan ls -lsa /path/to/media_root gibi). Django çalıştıran kullanıcının klasöre yazma izni olduğundan emin olun. Ayrıca, asermax'ın işaret ettiği gibi, MEDIA_ROOT'unuz içinde bir resim dizini oluşturduğunuzdan emin olun.

Belki de this issue var serving other directories

GÜNCELLEME serving static files özellikle bölüm belgelerine bakın. http://wiki.apache.org/httpd/13PermissionDenied Buna bir göz atın im.save(tf2, "JPEG")

+0

Pencereyi kullanıyorum atm. MEDIA_ROOT = 'C:/djcode/mysite/photo/media' ortamındaki medya klasörümü buldum ve izin üzerine tam kontrol ekledim. Hata hala görünüyor. Ne yapmalı ? – supersheep1

+0

asermax, bu benim resim klasörü C:/djcode/mysite/photo/media ' – supersheep1

+0

Hayır, bu resim klasörü C:/djcode/mysite/photo/media/images olmalıdır. Bu dizine resim yüklediğiniz models.py dosyasının upload_to parametresinde söylediniz. Asermax'ın doğru bir şekilde işaret ettiği gibi, henüz oluşturmadıysanız, klasörü oluşturmanız gerekecektir. –

-1

seti SELinux'un permisions ile im.save(tf2.name, "JPEG") yerine deneyin, bu

İlgili konular