Otra es que el archivo misitio/archivo/
archivo1.pdf lo copies a otro dir misitio/archivo_publicos/
archivo1_<uniqueid>.pdf le digas al apache que no muestre listado de archivos
el uniqueid podria ser un hash de fecha y hora + nombre de archivo
para que nunca te de el mismo hash y un cron que cada 10 min borre los
archivos publicos ....
hay varias formas
2010/7/7 refreegrata <refre...@yahoo.com>:
> --
> Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
> Si quieres publicar en este grupo, envía un mensaje de correo
> electrónico a djan...@googlegroups.com
> Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
> Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
--
Andres Vargas
www.zodman.com.mx
Una opción -como ya te respondieron- es cargar el contenido del archivo
y pasarlo al HttpResponse dentro un view.
No tendrías problema si los archivos son pequeños, si son muy grandes
entonces tendrías un consumo extra de memoria, y además si tienes
slow-clients podrías tener todo un proceso python/django mandando
un file de 100Mb que demoraría bastante.
Otra opción es usar soporte en el servidor para mandar el archivo,
es decir, tu le indicas al servidor web qué archivo mandar, y no es
tu aplicación quien envía el archivo.
En el caso de apache necesitas mod_xsendfile:
response = HttpResponse()
response['X-Sendfile'] = '/full/path/to/file'
response['Content-Type'] = 'some/content_type'
response['Content-Length'] = os.stat('/full/path/to/file').st_size
response['Content-Disposition'] = 'attachment; filename="foo"'
return response
En el caso de nginx se usa el header X-Accel-Redirect
http://wiki.nginx.org/NginxXSendfile
Pero esto te limitaría a un único servidor web que soportaría el enviar
archivos en tu aplicación. Tampoco podrías usar el dev server.
~Rolando
Para copiar puedes usar shutil.copy(), aunque creo -si no usas windows-
te sería suficiente un enlace simbólico -> os.symlink()
> La opción del stringio y el httpresponse aunque en teoría la entiendo,
> la verdad es que aún no capto del todo como programarla. Yo vengo del
> mundo PHP, y ahí yo hago algo como
>
> header ('Content-Disposition:
> attachment; filename='.$name);
> header ("Content-Type: application/
> octet-stream");
> header ("Content-Length:
> ".filesize($rute));
> readfile($rute);
> die();
def view_passwd(request):
content = open('/etc/passwd').read()
response = HttpResponse(content, mimetype='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=passwd'
response['Content-Length'] = len(content)
return response
La opción del StringIO -creo- se utiliza cuando generas un pdf o imagén
on-the-fly. En apis donde escribes a un archivo, en lugar de:
something.save(open('foo', 'w'))
content = open('foo').read()
Utilizas un StringIO
buffer = StringIO()
something.save(buffer)
content = buffer.read()
Y te evitas escribir a disco.
~Rolando