Django的Media目录设置保护
我们都知道Django的media目录默认是可以直接访问的,但是有些需求需要media目录下的部分目录不能直接访问,这时候就需要进行权限控制。大致的操作方式是,media目录不再交给nginx处理,而是由django自己先处理,进行权限控制后再交给nginx使用内部访问。
这里,我们假设我们的django工程是myshop,需要保护的目录是/myshop/media/dir1和/myshop/dir2。
1.在项目目录下创建一个views.py,即/myshop/myshop/views.py
from django.http import HttpResponse
from django.http import HttpResponseForbidden
PROTECTED_DIR=['dir1', 'dir2']
def media_access(request, path):
access_granted = True
for protect_dir in PROTECTED_DIR:
if protect_dir in path:
#在这里进行访问控制,我们这里的示例,只要是登录用户就允许访问
if request.user.is_authenticated:
pass
else:
access_granted = False
break
if access_granted:
#准许访问,我们重定向一下到/protected/,然后在nginx处理静态文件访问
response = HttpResponse()
del response['Content-Type']
response['X-Accel-Redirect'] = ('/protected/' + path).encode('utf-8')
return response
else:
#不允许访问,直接返回禁止访问
return HttpResponseForbidden('未经授权,禁止访问')
2.在/myshop/myshop/urls.py里添加:
from django.urls import re_path
from .views import media_access
urlpatterns = [
#......略
re_path(r'^media/(?P<path>.*)', media_access, name='media'),
]
3.修改nginx设置
#原来,我们的对于media目录的处理设置,大概如下,注释掉
#location /media {
# alias /myshop/media;
#}
#修改如下
location /protected {
internal;
alias /myshop/media;
}
本文来自博客园,作者:super_ip,转载请注明原文链接:https://www.cnblogs.com/superip/p/17428082.html