django 认证 .htaccess 静态文件
在我的应用里,用户可以上传文件给其他用户。为了让这些上传的文件只能被指定的用户访问,我需要一个静态文件的认证系统。
我的想法是为每个用户创建一个由Apache托管的目录,并通过.htaccess文件来限制对这个目录的访问。
这意味着每次创建一个新的Django用户时,我都需要在他们的目录里创建一个文件夹和相应的.htaccess文件。我知道我应该在用户模型的post_save信号中处理这个,但我不知道怎么从Python代码里在用户的目录中创建.htaccess文件。你能帮我解决这个问题吗?
或者,也许你有更好的解决方案来应对我的问题?
5 个回答
0
让Django来处理用户的登录和权限管理,然后用Apache的 mod_xsendfile
来负责实际文件的发送。记得把文件上传到一个不能直接访问的地方,最好是在Apache的文档根目录之外。
这个问题提供了一个很好的例子,说明如何实现这个功能,简单来说就是在你的视图中设置 response['X-Sendfile'] = file_path
。
django-sendfile 也能做到这一点,但支持多种不同的网络服务器(还有一些方便的快捷方式),而 django-private-files 也是类似的功能,但还实现了 PrivateFileField
。
1
为什么不创建一个叫做PrivateUploadedFile的对象呢?这个对象里面可以有一个字段用来存放文件,还有一个多对多的关系,用来记录哪些用户被允许查看这个文件?这样你就不用去调整Apache的配置了……
from django.contrib.auth.models import User
from django.db import models
import hashlib
def generate_obfuscated_filename(instance, filename):
hashed_filename = hashlib.sha1(str(filename)) #you could salt this with something
return u"your/upload/path/%s.%s" % (hashed_filename, filename.split(".")[-1]) #includes original file format extension
class PrivateUploadedFile(models.Model):
file = models.FileField(upload_to=generate_obfuscated_filename)
recipients = models.ManyToManyField('User')
uploader = models.ForeignKey('User', related_name="files_uploaded")
def available_to(self, user):
#call this as my_uploaded_file_instance.available_to(request.user) or any other user object you want
return user in self.recipients.all() #NB: not partic. efficient, but can be tuned
1
1. 用Python自动重写.htaccess文件?
2. 使用一个包含用户信息的数据库,并通过Apache的会话功能来进行身份验证?