2009-11-05 30 views
22

Actualmente tengo un modelo simple definido, con una función de fotoupload que utiliza el complemento django thumbnails.Permiso Error denegado con Django al cargar un archivo

pero cuando intento cargar me da el siguiente error:

OSError at /admin/products/photo/add/ 

(13, 'Permission denied') 

Ahora, sé que esto es que parece ser un problema de permisos, por lo que la primera cosa que he comprobado eran permisos en el directorio y cambió estos a 777 (solo para probar), reiniciaron el servidor y fcgi y todavía da el error.

Rastreo

Traceback: File "/usr/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response 
    92.     response = callback(request, *callback_args, 
**callback_kwargs) File "/usr/lib/python2.6/dist-packages/django/contrib/admin/options.py" in wrapper 
    226.     return self.admin_site.admin_view(view)(*args, 
**kwargs) File "/usr/lib/python2.6/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func 
    44.   response = view_func(request, *args, **kwargs) File "/usr/lib/python2.6/dist-packages/django/contrib/admin/sites.py" in inner 
    186.    return view(request, *args, **kwargs) File "/usr/lib/python2.6/dist-packages/django/db/transaction.py" in _commit_on_success 
    240.     res = func(*args, **kw) File "/usr/lib/python2.6/dist-packages/django/contrib/admin/options.py" in add_view 
    734.     self.save_model(request, new_object, form, change=False) File "/usr/lib/python2.6/dist-packages/django/contrib/admin/options.py" in save_model 
    557.   obj.save() File "/usr/lib/python2.6/dist-packages/django/db/models/base.py" in save 
    410.   self.save_base(force_insert=force_insert, force_update=force_update) File "/usr/lib/python2.6/dist-packages/django/db/models/base.py" in save_base 
    483.      values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields if not isinstance(f, AutoField)] File "/usr/lib/python2.6/dist-packages/django/db/models/fields/files.py" in pre_save 
    252.    file.save(file.name, file, save=False) File "/var/www/django_projects/gang/../gang/products/thumbs.py" in save 
    84.   super(ImageWithThumbsFieldFile, self).save(name, content, save) File "/usr/lib/python2.6/dist-packages/django/db/models/fields/files.py" in save 
    91.   self.name = self.storage.save(name, content) File "/usr/lib/python2.6/dist-packages/django/core/files/storage.py" in save 
    47.   name = self._save(name, content) File "/usr/lib/python2.6/dist-packages/django/core/files/storage.py" in _save 
    146.    os.makedirs(directory) File "/usr/lib/python2.6/os.py" in makedirs 
    150.    makedirs(head, mode) File "/usr/lib/python2.6/os.py" in makedirs 
    150.    makedirs(head, mode) File "/usr/lib/python2.6/os.py" in makedirs 
    150.    makedirs(head, mode) File "/usr/lib/python2.6/os.py" in makedirs 
    157.  mkdir(name, mode) 

Exception Type: OSError at /admin/products/photo/add/ Exception Value: (13, 'Permission denied') 

El usuario que el demonio FCGI se está ejecutando en duda tiene acceso a leer y escribir en ese directorio.

De settings.py

MEDIA_ROOT = '/var/www/sites/gang/http/media/' 
MEDIA_ROOT_URL = '/media/' 

Respuesta

8

Intente comprobar los permisos en cada directorio de la ruta que comienza en /. Solo un pensamiento.

+1

Hola, peter, este cambio de permisos de los directorios raíz parece un poco inseguro? – ismail

+5

Uh, creo que dije 'verificar', no 'cambiar' ... gran diferencia. He visto la siguiente situación: tienes tu DOCROOT en/a/b/c/d. 'd' es 777 (normalmente por desesperación), 'a', y 'b' son 755 (normal), pero 'c' es 700 (o similar) lo que prácticamente termina la fiesta. Sigues jugando con 'd', pero fue 'c' (o lo que sea) ese fue el problema. –

+1

gracias, descubrí el problema pero tu respuesta fue de ayuda. – ismail

2
mkdir(name, mode) 

Exception Type: OSError at /admin/products/photo/add/ 

pero su aplicación se implementa en

/var/www/django_projects/gangr/../gangr/ 

¿Tiene una ruta de directorio se establece en una ruta absoluta "/ admin/productos/foto/añadir /" en lugar de algo relativo como "admin/productos/foto/agregar/"?

Compruebe MEDIA_ROOT y MEDIA_URL en su archivo settings.py.

http://docs.djangoproject.com/en/dev/ref/settings/#media-root

+0

hola mi solicitud es realmente desplegado en: /var/www/django_projects/gangr/productos/ saben Dont por qué está diciendo /.../gangr Me parece sin embargo tener una configuración MEDIA_ROOT (que apunta a la http utilizado por lightttpd es decir '.../http/media', y MEDIA_ROOT_URL que es '/ media /' – ismail

+0

He actualizado la pregunta con mi settings.py info – ismail

59

Me acabo de encontrar con el mismo problema. Y encontró la solución si está hospedando con Apache como su servidor. Por ejemplo, si la configuración de mi fueron:

MEDIA_ROOT = '/var/www/media/geekingreen'

entonces yo sólo tendrá que dar esa carpeta los permisos correctos de forma recursiva para asegurarse de que cualquier sub-carpetas también tienen el mismo permiso. El grupo predeterminado para apache es www-data, así que para dar permiso a mi aplicación django ejecutaría estos comandos.

cd /var/www/media 
chgrp -R www-data geekingreen/ 
chmod -R g+w geekingreen/ 

El chgrp -R geekingreen www-data/ comando cambia el geekingreen directorio y los subdirectorios que tener las www-data grupo.
El comando chmod -R g + w geekingreen/ cambia los permisos que el grupo tiene en todas estas carpetas que ahora pertenecen a www-data, para ahora tener el permiso de escritura. Obviamente requerido para cargas.

Espero que esto pueda ayudar a cualquiera que pueda haber tenido un problema similar.

+0

Esto es lo suficientemente limpio para mí +1 –

+0

gran publicación! resuelto mi problema gracias por ello :) – Ron

+0

@geekingreen ¿Es posible hacer lo mismo en el servidor de desarrollo? – nima

1

Por si acaso se encuentra con esto al ejecutar su servidor de desarrollo. Ejecuté el servidor de desarrollo como root como este: sudo python manage.py runserver 0.0.0.0:80 para probar el sitio con un iPad en la misma red LAN. Los archivos de caché generados en esa sesión pertenecían a la raíz. Entonces, cuando ejecuté el proyecto al día siguiente NO como root obtuve el permiso denegado.

Cuestiones relacionadas