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;
}
作者:superip
出处:https://www.cnblogs.com/superip/p/17428082.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
本文来自博客园,作者:super_ip,转载请注明原文链接:https://www.cnblogs.com/superip/p/17428082.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!