【发布时间】:2011-03-18 14:22:12
【问题描述】:
我想设置一个允许特定用户访问特定媒体的 Django 服务器。我敢肯定这不会那么难做,我只是有点傻。
例如,我希望 USER1 能够访问 JPEG1、JPEG2 和 JPEG3 而不是 JPEG4,并且 USER2 能够访问 JPEG3 和 JPEG 4。
[我知道我应该因为使用 Django 来提供媒体而被烧死,但这就是我目前正在做的事情,当我开始真正使用汽油时我会改变它。]
【问题讨论】:
我想设置一个允许特定用户访问特定媒体的 Django 服务器。我敢肯定这不会那么难做,我只是有点傻。
例如,我希望 USER1 能够访问 JPEG1、JPEG2 和 JPEG3 而不是 JPEG4,并且 USER2 能够访问 JPEG3 和 JPEG 4。
[我知道我应该因为使用 Django 来提供媒体而被烧死,但这就是我目前正在做的事情,当我开始真正使用汽油时我会改变它。]
【问题讨论】:
您可以使用 django 通过在请求中返回文件来发送文件,如 Vazquez-Abrams 链接所示。
但是,由于效率的原因,您最好在 apache 中使用 mod_xsendfile(或 lighttpd 中的类似设置)。 Django 发送它的速度没有那么快,在保留使用开发服务器静态功能的选项的同时这样做的一种方法是http://pypi.python.org/pypi/django-xsendfile/1.0
至于什么用户应该能够访问什么 jpeg,您可能必须自己实现这一点。一种简单的方法是为具有访问权限的用户创建一个具有多对多字段的图像模型,以及一个检查当前用户是否在这些用户中的函数。类似的东西:
if image.users_with_access.filter(pk=request.user.id).exists():
return HttpResponse(image.get_file())
当然还有很多其他代码,仅作为示例。为此,我实际上在自己的项目中使用了修改后的 mod_xsend。
【讨论】:
您可以将媒体放在http://foo.com/media/blah.jpg 中,并在urls.py 中设置media/(?P<file>.*) 以指向检查用户及其权限的视图blahview:
from you_shouldve_made_one_anyways import handler404
def blahview(request,*args,**kwargs):
if cannot_use( request.user, kwargs['username'] ): return handler404(request)
...
虽然为了清楚起见,我确实不建议通过 Django 提供媒体服务。
【讨论】:
您只需要适当地frob the response。
【讨论】: