django身份验证.htaccess静态

时间:2010-05-06 12:03:24

标签: python django apache

在我的应用中,用户可以为其他用户上传文件。 为了使上传的文件只能访问地址,我需要某种静态文件认证系统。

我的想法是为每个用户创建apache托管目录,并使用.htaccess限制对此derectory的访问。

这意味着每次创建新的django用户时,我都需要在其中创建一个目录和相应的.htaccess文件。我知道我应该在用户模型上使用post_save信号,但我不知道如何在python级别的用户目录中创建.htaccess。你能帮帮我吗?

或许您可以更好地解决我的问题?

5 个答案:

答案 0 :(得分:1)

  1. 使用python自动重写.htaccess吗?
  2. 与用户一起使用数据库并使用Apache会话进行身份验证?

答案 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提供所有文件效率不高。但是,只有安全才能将文件提供给允许的用户。

相关问题