viernes, diciembre 05, 2008

Cambiar permisos de archivos con python

Pues bien la historia comienza así:
Estoy desarrollando una aplicación con django para una galeria de arte, la url de la pagina en desarrollo es http://laotraferia.nodo-lab.com que después apuntará a http://www.laotraferia.com y pues probé con django-audioplayer que es un tag para embeber un reproductor de mp3 en la pagina, y no me funcionaba porque por algun motivo extraño al subir el mp3, me quedaba sin permisos de lectura en el servidor, por lo cual decidí que debia cambiarle los permisos cada vez que suban el archivo por lo cual debia reescribir el metodo save en el modelo:

def save(self,force_insert=False, force_update=False):
super(Audio,self).save(force_insert,force_update)


Y allí cambiar los permisos cada vez que guarden el objeto, por lo cual busque en la pagina de python, y encontre el metodo chmod en el modulo os, y primero intenté:

>>> import os
>>> os.chmod("archivo","777")

Al viejo estilo de linux, pero esto me genera un error pues el modo debe ser un entero y no una cadena, hice este cambio y no me genero error pero me cambió los permisos de una forma extraña, luego lei un poco más y es que esto debe hacerse usando otro modulo stat, de la siguiente manera:

>>> import os
>>> import stat
>>> os.chmod("archivo",stat.S_IRUSR+stat.S_IWUSR+stat.S_IRGRP+stat.S_IXGRP)

y de esta manera me deja los permisos de lectura y escritura para el usuario y lectura para los demás.

Estas variables del modulo stat son enteros, y equivalena a un 420.

Más adelante debo entender bien el porque de esto.

Actualización:
Definitivamente el problema siempre es capa 8, primero y más importante, a partir de la versión 1.0.2 django, existe una opcion de configuracion para establecer cuales son los permisos con los cuales nuestro framework favorito debe dejar los archivos que se suban a través del admin y formularios.
Esta variable es FILE_UPLOAD_PERMISSIONS y debe contener el valor que desamos tengan los archivos, si queremos no usar lo anterior del modulo stat, lo que debemos es anteponer un 0 al modo octal que conocemos de chmod, es decir en vez de poner un 420 que no nos es familiar podemos poner 0644 sin comillas ni nada, de esta manera python sabe que el 644 es un octal y no un entero. De hecho si entramos al interprete de python y escribimos 0644 este se nos mostrara como un entero (420)

3 comentarios:

Fidel dijo...

Debes tener en cuenta que los permisos de chmod se especifican en octal, por lo que deberías pasarle 0777 en vez de 777.

Unknown dijo...

Si claro fidel, esto hay que tenerlo en cuenta, pero ese numero en octal se usa en linux, con el modulo os, los valores son distintos.

Camilo dijo...

Que bueno saber eso, seguramente muchos necesitaremos saberlo en algun momento