在我的应用中,用户可以为其他用户上传文件。 为了使上传的文件只能访问地址,我需要某种静态文件认证系统。
我的想法是为每个用户创建apache托管目录,并使用.htaccess限制对此derectory的访问。
这意味着每次创建新的django用户时,我都需要在其中创建一个目录和相应的.htaccess文件。我知道我应该在用户模型上使用post_save信号,但我不知道如何在python级别的用户目录中创建.htaccess。你能帮帮我吗?
或许您可以更好地解决我的问题?
答案 0 :(得分:1)
答案 1 :(得分:1)
为什么没有一个PrivateUploadedFile对象,该对象具有该文件的字段,以及允许读取该文件的任何用户的m2m关系?那么你根本不必乱用Apache conf ......
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
答案 2 :(得分:0)
遇到此django-sendfile,可用于提供静态文件。可能会有帮助。
答案 3 :(得分:0)
让Django正常处理身份验证和授权,然后使用Apache的mod_xsendfile
让Apache处理发送实际文件。请记住将文件上传到无法直接访问的位置,最好是在Apache的文档根目录之外。
This question有一个很好的示例说明如何实现此行为,但它基本上归结为在您的视图中设置response['X-Sendfile'] = file_path
。
django-sendfile执行相同的操作,但对于多个不同的Web服务器(和便捷快捷方式),django-private-files是相同的,但也实现了PrivateFileField
答案 4 :(得分:-1)
添加一个控制用户身份验证的视图,并通过django's static files serving tools提供文件:
def get_file(request, some_id):
# check that the user is allowed to see the file
# obtain the file name:
path = path_from_id(some_id)
# serve the file:
return django.views.static.serve(request, path, document_root=your_doc_root)
这是一个非常安全的解决方案,但如果以这种方式提供大量文件,可能并不理想。
编辑:django页面上的免责声明不适用于此处。显然,使用static.serve
提供所有文件效率不高。但是,只有安全才能将文件提供给允许的用户。