2009-09-21 7 views
5

Estoy buscando una manera de venderle a alguien una tarjeta en un evento que tendrá un código único que podrán usar más adelante para descargar un archivo (mp3, pdf, etc.) solo una vez y máscara la ubicación verdadera del archivo para que una persona inteligente que descargue el archivo no pueda descargar el archivo más de una vez. Sería bueno alojar el archivo en Amazon S3 para ahorrar en el ancho de banda donde nuestro servidor comparte ubicación.¿Qué es una solución de Django/Python para proporcionar una URL única para que las personas descarguen archivos?

Mi idea para los códigos sería pregenerar los códigos únicos que se imprimirán en las tarjetas y almacenarlos en una base de datos que también podría tener un campo que almacena el número de veces que se descargó el archivo. De esta forma podríamos establecer cuántos intentos le permitiríamos al usuario descargar el archivo.

La parte sobre la que necesito instrucciones es cómo ocultar/enmascarar la ubicación del archivo original para que las personas no puedan robar esa url y luego descargar el archivo tantas veces como lo deseen. He hecho búsquedas en Google y no estoy buscando con las palabras clave correctas o no hay muchas bibliotecas o fragmentos para este tipo de cosas.

Supongo que podría ser capaz de manipular algo utilizando django.views.static.serve que actúa como una especie de proxy entre el archivo real y el usuario que descarga el archivo. El único inconveniente de este método es que necesitaría usar el servidor web real y no podría almacenar el archivo en Amazon S3.

Cualquier sugerencia o idea es muy apreciada.

Respuesta

2

Puede simplemente usar algo simple como mod_xsendfile. Esta funcionalidad también está disponible en otros servidores web populares como lighttpd o nginx.

Funciona de esta manera: cuando se habilita su aplicación (por ejemplo, una secuencia de comandos PHP trivial) puede enviar un encabezado de respuesta especial, haciendo que el servidor web sirva un archivo estático.

Si desea que funcione con S3, deberá gestionar todas y cada una de las solicitudes de esta manera, lo que significa que el tráfico pasará por su sitio, desde allí a AWS, de regreso a su sitio y de vuelta al cliente. ¿Admite S3 enlaces/alias simbólicos? Si es así, puede redirigir a un usuario válido a una de las URL simbólicas y eliminar ese enlace simbólico después de un par de horas.

3

Idea aseada. Sin embargo, advertiría contra el método de descarga única, porque no hay garantía de que su primer intento de descarga sea exitoso. Tal vez use un método de expiración de tiempo en su lugar?

Pero ciertamente es posible hacer esto con Django. He aquí un resumen de los planteamientos básicos:

  • configurar una URL Django para servir a estos archivos
  • utilizar un parámetro GET que es una cadena única para identificar qué archivo de conseguir.
  • Guarde una tabla de base de datos que tenga FileField para descargar el archivo. Esta tabla asigna las cadenas únicas a la ubicación del archivo en el sistema de archivos.
  • Para servir el archivo como una descarga, configurar los encabezados de respuesta en la vista de la siguiente manera:

(path es la ubicación del archivo de servir)

with open(path, 'rb') as f: 
    response = HttpResponse(f.read()) 
response['Content-Type'] = 'application/octet-stream'; 
response['Content-Disposition'] = 'attachment; filename="%s"' % 'insert_filename_here' 
return response 

Puesto que estamos utilizando este Django página para servir el archivo, el usuario no puede encontrar la ubicación del archivo original.

+0

Este es el enfoque más básico, pero podría dañar su servidor si sirve muchos de estos archivos, ya que todo el archivo debe transmitirse a través de un subproceso de servidor de Python/Django. –

+0

Sí, no es una solución súper rápida, pero parece que en su situación el rendimiento no va a ser un problema. Él tiene que vender físicamente a cada usuario una tarjeta, por lo que no esperaría en ningún lugar cerca de 100 descargas por día. –

Cuestiones relacionadas