如何将静态文件限制为在Django中上传它们的用户?

问题描述 投票:3回答:2

从我读到的,静态文件应该由服务器直接提供,而不是使用Python和Django。但我需要限制文件访问上传它们的用户。遗憾的是,该文档没有关于提供用户在生产环境中上传的静态文件的部分。

如果我是对的,Facebook会使用难以猜测的长网址。这听起来像是一种合理的方法。如何在Django中自动生成长ID并将其用于上传的媒体文件?

django security random static-files
2个回答
5
投票

你可以使用slugifydatetime

from django.template.defaultfilters import slugify
import datetime

class MyModel(models.Model):
    title = models.CharField(max_length=150, db_index=True)
    image = models.Charfield(max_length=150, unique=True)
    ....
    ....
    def save(self):
        super(MyModel, self).save()
        date = datetime.date.today()
        self.image = '%i/%i/%i/%s' % (
            date.year, date.month, date.day, slugify(self.title)
        )
        super(MyModel, self).save()

要不就

使用time

from time import time

def get_upload_file_name(instance, filename):
    return "uploaded_files/%s_%s" %(str(time()).replace('.','_'), filename)

class MyModel(models.Model):
    description = models.TextField()
    image = models.ImageField(upload_to=get_upload_file_name)

    def __unicode__(self):
        return "%s --> %s" % (self.user, self.description)

要么

通过使用此模块 - django-unique-random

希望能帮助到你!


1
投票

如果要以正确的方式执行此操作,则应在支持它们的Web服务器中使用X-SendFile / X-Accel-Redirect标头(Apache,NGinx,或许更多)。您可能需要在Web服务器上启用模块(例如Apache中的mod_xsendfile)。

X-SendFile的作用是它指示前端Web服务器用X-SendFile头中提到的文件替换响应体。这样,您可以让Django应用程序检查文件的访问权限,同时将文件下载服务卸载到前端服务器。

© www.soinside.com 2019 - 2024. All rights reserved.