到目前为止,我一直在试图保护Django的媒体文件,并且没有运气!我只是想让它只在管理员用户可以访问媒体文件夹的地方。这是我的Nginx文件。
server {
listen 80;
server_name xxxxxxxxxx;
location = /favicon.ico {access_log off; log_not_found off;}
location /static/ {
alias /home/{site-name}/static_cdn/;
}
location /media/ {
internal;
root /home/{site-name}/;
}
location / {
this is setup and working. Didn't include Code though
}
我的网址文件
urlpatterns = [
url(r'^media/', views.protectedMedia, name="protect_media"),
]
我的观点
def protectedMedia(request):
if request.user.is_staff:
response = HttpResponse()
response['Content-Type'] = ''
response['X-Accel-Redirect'] = request.path
return response
else:
return HttpResponse(status=400)
这产生了404 Not Found Nginx错误。这里看起来有什么明显的错误吗?谢谢!
顺便说一句,我已经尝试在Nginx设置中将/ media /添加到根URL的末尾。
答案 0 :(得分:3)
这就是@Paulo Almeida解决这个问题的原因。
在nginx文件中,我改变了我以前所拥有的......
location /protectedMedia/ {
internal;
root /home/{site-name}/;
}
我的网址是......
url(r'^media/', views.protectedMedia, name="protect_media"),
视图是......
def protectedMedia(request):
if request.user.is_staff:
response = HttpResponse(status=200)
response['Content-Type'] = ''
response['X-Accel-Redirect'] = '/protectedMedia/' + request.path
return response
else:
return HttpResponse(status=400)
这完美无缺!现在只有管理员用户可以访问存储在我的媒体文件夹中的媒体文件。
答案 1 :(得分:3)
这对我有很大帮助,只需进行少量的更新和修改即可
urls.py:
skip
views.py:
re_path(r'^media/', protectedMedia, name="protect_media")
我必须将nginx配置更改为以下内容:
from django.http import HttpResponse
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
def protectedMedia(request):
response = HttpResponse(status=200)
response["Content-Type"] = ''
response['X-Accel-Redirect'] = '/protectedMedia/' + request.path
return response
注意:
如果您仍然停留在某个地方,这会给我提供更多的背景信息:https://wellfire.co/learn/nginx-django-x-accel-redirects/