django 认证 .htaccess 静态文件

2 投票
5 回答
1380 浏览
提问于 2025-04-15 22:25

在我的应用里,用户可以上传文件给其他用户。为了让这些上传的文件只能被指定的用户访问,我需要一个静态文件的认证系统。

我的想法是为每个用户创建一个由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的会话功能来进行身份验证?

撰写回答