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;
}

 

posted @ 2023-05-24 13:46  super_ip  阅读(87)  评论(0编辑  收藏  举报