Hola! :D no sé nada de django, quiero estudiarlo en está semana. Aún así tengo una pregunta que me mata de la curiosidad: ¿es posible crear enlaces temporables para contenido descargable? La idea es básicamente crear un enlace y que luego de un determinado número de descargas del archivo, dicho enlace sea inservible. No busco un ejemplo completo, con ver como crear e invalidar el enlace satisfacería mi curiosidad.

Saludos!

preguntado 02 May '12, 21:33

shackra's gravatar image

shackra
301264546
Aceptadas: 33%

@shackra, si la respuesta de @aaloy es buena deberías aceptarla.

(12 May '12, 13:14) haplo

Oops... estaba dormido, sorry xd

(13 May '12, 04:55) shackra

La respuesta es sí, se puede, al final es sólo un tema de programación y de controlar las veces que se accede al enlace.

La idea es que el archivo no lo sirva directamente el servidor web sinó que pase primero por la aplicación (esto se puede hacer a través de las cabeceras que servidores como ngnix o apache proporcionan) y es la aplicación la que controla si el fichero se puede servir o no.

En esta etapa vas incrementando el contador según la política de negocio que requieras, al llegar al máximo sencillamente dejas de autorizar.

Ejemplos de la idea:

http://djangosnippets.org/snippets/2226/ http://codeghar.wordpress.com/2009/12/31/django-apache-and-x-sendfile-in-debian/

enlace permanente

respondido 03 May '12, 00:14

aaloy's gravatar image

aaloy
541109
Aceptadas: 85%

Solo quiero acotar para el amigo shackra, en Django, las URLs las "unís" a funciones (o clases) de python a través de expresiones regulares; entonces, podría tener entre las urlpatterns:

1
url(r'^descargas/(?P<codigo>.+)/$', funcion_de_descarga)

La idea de la función sería algo como esto:

1
2
3
4
5
@login_required
def funcion_de_descarga(codigo='val'):
    # aquí iría el proceso, si el código es valido o no, etc.
    # 'val' seria el valor capturado en la URL
    # Y devolves el archivo o un aviso

Así como esta la expresión regular captura cualquier cosa (el punto y el mas), así que podría ser un fragmento de path también.


EDITO: Por razones de seguridad, como menciona @monobot, puede ser necesario restringir la descarga del archivo no solo en el numero de veces (como plantea la pregunta) sino quizás en un usuario determinado, por ello agrego el decorador @login_required en la función, es de notar que el decorador es la forma simple, pero bien se podría poner ese trabajo dentro de la función, es decir, seria parte del "código de la política de descarga", porque podria ser necesario tambien que mas de un usuario necesite descargarlo (nuevamente el decorador simple seria @permission_required )

enlace permanente

respondido 04 May '12, 01:41

schcriher's gravatar image

schcriher
8181921
Aceptadas: 36%

editó 04 May '12, 17:50

1

Lo malo de eso @schcriher es que el usuario puede manipular la url para seguir descargando, es decir el control esta del lado del usuario y no del programador.

(04 May '12, 12:31) monobot

Bueno, solo ponía la idea general que mencionaba @aaloy en un trozo de código, ya que @shackra decía no saber nada de Django. Eso que mencionas @monobot es muy simple usando las herramientas de Django, la forma fácil seria usar un decorador [1] en la función y asunto arreglado, ejemplo: @login_required

[1] https://docs.djangoproject.com/en/dev/topics/auth/

(04 May '12, 17:42) schcriher
Tu respuesta
Activar/desactivar vista previa

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Trucos del editor

  • *italic* or __italic__
  • **negrita** o __negrita__
  • enlace:
    [texto](http://url.com/ "Pregunta")
  • imagen:
    ![alt texto](/path/img.jpg "Pregunta")
  • lista numerada:
    1. Foo
    2. Bar
  • Código:
    • Dentro de un parrafo:
      `codigo`
    • Fragmento de código:
      Selecciona el texto y usa el botón del icono de ceros y unos
  • Resaltado de sintaxis:
    Hay dos maneras de hacerlo:
    • La 1ª línea es un Shebang #!/usr/bin/env python
    • La 1ª línea es un lexer
      :::python

      Algunos lexer validos:
      :::python
      :::django
      :::css+django
      :::html+django
      :::console
      :::pycon
  • Para añadir un salto de línea simplemente deja una línea en blanco entre parrafos
  • se permite código HTML básico

Etiquetas de la pregunta:

×174
×1
×1

pregunta realizada: 02 May '12, 21:33

pregunta vista: 667 veces

última modificación: 13 May '12, 04:55