Permisos de usuario Django para servir medios
-
18-09-2020 - |
Pregunta
Quiero configurar un servidor DJANGO que permita a ciertos usuarios acceder a ciertos medios.Estoy seguro de que esto no puede ser tan difícil de hacer y solo estoy siendo un poco tonto.
Por ejemplo, quiero que user1 pueda acceder a JPEG1, JPEG2 y JPEG3, pero no JPEG4, y User2 para poder acceder a JPEG3 y JPEG 4.
[Sé que debería quemarme con fuego por usar Django para servir a los medios de comunicación, pero eso es lo que estoy haciendo en este momento, lo cambiaré cuando comience a correr en Gas.]
Solución
Puede enviar un archivo usando Django al devolver el archivo en la solicitud, como se muestra en el enlace de Vázquez-Abrams.
Sin embargo, probablemente lo haría mejor utilizando MOD_XSENDFILE en Apache (o configuraciones similares en LightTPD) debido a la eficiencia.Django no es tan rápido al enviarlo, una forma de hacerlo, mientras que mantener la opción de usar la función estática del servidor de desarrollo sería http://pypi.python.org/pypi/django-xsendfile/1.0
En cuanto a qué usuario debería poder acceder a qué JPEG, probablemente tendrá que implementar esto usted mismo.Una forma sencilla sería crear un modelo de imagen con un campo de muchos a muchos a los usuarios con acceso y una función para verificar si el usuario actual está entre esos usuarios.Algo a lo largo de la línea de:
if image.users_with_access.filter(pk=request.user.id).exists():
return HttpResponse(image.get_file())
con un montón de otro código, por supuesto y solo como ejemplo.En realidad, utilizo un mod_xsend modificado en mi propio proyecto para este propósito.
Otros consejos
Solo necesitas a Fob la respuesta apropiadamente.
Puede colocar los medios en http://foo.com/media/blah.jpg
y configurar un media/(?P<file>.*)
en urls.py
para apuntar a un vistazo blahview
que verifique al usuario y sus permisos dentro de:
from you_shouldve_made_one_anyways import handler404
def blahview(request,*args,**kwargs):
if cannot_use( request.user, kwargs['username'] ): return handler404(request)
...
Aunque solo para estar claro, lo hago no recomiendo servir medios a través de Django.