2013-02-10 45 views
5

Sto lavorando a questa applicazione di foto organizzatore e condivisione parte I a http://lightbird.net/dbe/photo.html. Sto cercando di generare una miniatura e quando lo faccio. Ho ricevuto questo errore.Errore Django (13, 'Autorizzazione negata')

Ho 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 

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

Il problema è qui:

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) 

Come posso correggere questo errore?

+0

Avete creato la cartella 'immagini' sul 'MEDIA_ROOT'? – asermax

risposta

1

Mi sembra che django non disponga delle autorizzazioni necessarie per accedere alla cartella MEDIA_ROOT.

Dai un'occhiata alle tue impostazioni MEDIA_ROOT nel tuo file settings.py. Quindi controlla i permessi sulla cartella (qualcosa come ls -lsa /path/to/media_root da una shell bash). Assicurati che l'utente esegua django come permesso di scrittura sulla cartella.

Inoltre, come indicato da asermax, assicurarsi di aver creato una directory di immagini all'interno di MEDIA_ROOT.

Dai un'occhiata alla documentazione per serving static files in particolare la sezione relativa serving other directories

UPDATE

Forse è this issue. Provare a sostituire im.save(tf2.name, "JPEG") con im.save(tf2, "JPEG")

+0

Sto usando window vista atm. Ho individuato la mia cartella multimediale che si trova in MEDIA_ROOT = 'C:/djcode/mysite/photo/media' e ho aggiunto il controllo completo sull'autorizzazione. L'errore appare ancora. Cosa dovrebbe fare? – supersheep1

+0

asermax, si supponga di essere la mia cartella di immagini C:/djcode/mysite/photo/media ' – supersheep1

+0

No, la cartella delle immagini deve essere in C:/djcode/mysite/photo/media/images. Hai detto nel parametro upload_to del tuo modello.py che stai caricando le immagini in questa directory. Come giustamente sottolinea asermax, dovrai creare la cartella se non l'hai già fatto. –

Problemi correlati