一个简单的Django应用程序,用于提供受保护的媒体
项目描述
Django Protected Media
Django Protected Media是一个Django应用程序,用于以受保护的方式管理被认为是敏感的媒体。
不仅媒体存储在单独的文件系统位置,而且还需要授权才能访问。
该应用程序允许设置Django执行授权,但将文件服务交给Web服务器,如Nginx。
快速入门
- 将"protected_media"添加到您的INSTALLED_APPS设置中,如下所示
INSTALLED_APPS = [
...
'protected_media.apps.ProtectedMediaConfig',
]
- 在您的项目urls.py中包含URLconf,如下所示:
path('protected/', include('protected_media.urls')),
- 如果需要调整默认设置,请将以下设置添加到
settings.py
中
PROTECTED_MEDIA_ROOT = "%s/protected/" % BASE_DIR
PROTECTED_MEDIA_URL = "/protected"
PROTECTED_MEDIA_SERVER = "nginx" # Defaults to "django"
PROTECTED_MEDIA_LOCATION_PREFIX = "/internal" # Prefix used in nginx config
PROTECTED_MEDIA_AS_DOWNLOADS = False # Controls inclusion of a Content-Disposition header
- 在您的模型中使用新的字段类
from protected_media.models import ProtectedImageField, ProtectedFileField
def SomeModel(models.Model):
document = ProtectedFileField(upload_to="uploads/")
picture = ProtectedImageField(upload_to="uploads/")
# Files will be stored under PROTECTED_MEDIA_ROOT + upload_to
概述
Django根据以下定义管理媒体
BASE_DIR = "/some/application/dir/"
MEDIA_ROOT = "%s/media/" % BASE_DIR
MEDIA_URL = "/media/"
文件和图片字段通常定义为
document = models.FileField(upload_to="uploads/")
picture = models.ImageField(upload_to="uploads/")
# Files will be stored under MEDIA_ROOT + upload_to
在典型的生产环境中,通常会使用nginx
(或其他服务器)来服务媒体
# Publicly accessible media
location ^~ /media/ {
alias /some/application/dir/media
}
当媒体应公开访问时,这工作得很好。然而,如果媒体需要受到保护,我们需要一种方式让Django检查对媒体请求是否仅允许已登录(或更严格的条件)的用户。
protected_media
应用程序
protected_media
应用程序由以下内容组成:
- 新的
settings.py
属性, - 自定义的FileSystemStorage类,
- 自定义的受保护媒体URL处理程序,以及
- 如果通过
nginx
或类似服务器提供服务的额外Web服务器配置。
受保护媒体存储在与公开可访问媒体不同的物理位置。您可以在settings.py
中指定以下设置:
PROTECTED_MEDIA_ROOT = "/some/application/dir/protected/"
PROTECTED_MEDIA_URL = "/protected"
PROTECTED_MEDIA_SERVER = "nginx" # Defaults to "django"
PROTECTED_MEDIA_LOCATION_PREFIX = "/internal" # Prefix used in nginx config
在定义需要受保护的文件或图片字段时,我们使用protected_media
应用程序提供的类之一
ProtectedFileField
ProtectedImageField
受保护的文件和图片字段通常定义为
document = ProtectedFileField(upload_to="uploads/")
picture = ProtectedImageField(upload_to="uploads/")
# Files will be stored under PROTECTED_MEDIA_ROOT + upload_to
这些类具有自定义存储后端ProtectedFileSystemStorage
,它管理受保护媒体的文件系统位置和URL。
当使用nginx
时,配置必须更新为如下所示:
# Publicly accessible media
location /media {
alias /some/application/dir/media;
}
# Protected media
location /internal {
internal;
alias /some/application/dir/protected;
}