Django为某些人隐藏媒体文件链接

des4xlb0  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(121)

我编程了一个功能,你可以从媒体文件夹下载一个文件,媒体文件取决于链接。问题是,如果您更改链接中的路径,您就可以访问所有媒体文件,而不仅仅是您应该下载的文件。我可以以某种方式禁止其他链接(与许可或什么)或有一个聪明的方法来解决整个事情?

ndasle7k

ndasle7k1#

我不确定我的方法是不是最聪明的,但是我通常会在有文件字段的模型中添加一个用户字段。然后,在返回文件的基于函数的视图中,我执行一个检查,看看request.user是否是同一个用户。另外,对于像这样的文件,我确保使用FileSystemStorage类沿着FileField类将它们存储在一个不可公开访问的目录中。
下面是几个片段来说明我自己的方法:

# settings.py
MEDIA_ROOT_FOR_SENSITIVE_FILES = '/path/to/your/special/folder'

# models.py
from functools import partial

from django.db import models
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.http import FileResponse
from django.http.response import Http404
from django.db.models import FileField

# Create a custom storage location, using a value from your settings file
sensitive_upload_storage = FileSystemStorage(location=settings.MEDIA_ROOT_FOR_SENSITIVE_FILES,
                                             base_url='/some_prefix/')
# ... and a file field that will use the custom storage
AuthenticatedFileField = partial(FileField, storage=sensitive_upload_storage)

class UserUpload(models.Model):
    user = models.ForeignKey('auth.User', on_delete=models.DO_NOTHING)
    file = AuthenticatedFileField()

# views.py / handles the url "/some_prefix/{PATH}".
def download_userupload(request, path):
    try:
        file = UserUpload.objects.filter(user=request.user, file=path)
    except UserUpload.DoesNotExist:
        return Http404

    return FileResponse(file.file)

希望这对你有帮助,如果你有任何进一步的问题,我很乐意跟进!

相关问题