Django中如何根据DEBUG模式限制静态JS文件的访问权限?
解决方案
方法1:自定义中间件拦截静态文件请求
写一个全局中间件,根据DEBUG状态拦截不符合权限的静态文件请求,一次配置覆盖所有App:
- 在项目根目录创建
middleware.py,写入以下代码:
from django.http import HttpResponseForbidden from django.conf import settings class StaticJSGuardMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 仅处理静态文件请求(匹配你的STATIC_URL前缀) if request.path.startswith(settings.STATIC_URL): relative_path = request.path[len(settings.STATIC_URL):] # 标记文件类型:混淆JS在static/js下(排除内层js目录),可读JS在static/js/js下 is_minified_js = relative_path.startswith('js/') and not relative_path.startswith('js/js/') is_raw_js = relative_path.startswith('js/js/') if settings.DEBUG: # DEBUG模式下禁止访问混淆JS if is_minified_js: return HttpResponseForbidden("Access to minified JS is forbidden in DEBUG mode.") else: # 生产环境禁止访问可读JS if is_raw_js: return HttpResponseForbidden("Access to raw JS is forbidden in production mode.") response = self.get_response(request) return response
- 在
settings.py的MIDDLEWARE列表中添加该中间件(需放在django.contrib.staticfiles.middleware.StaticFilesMiddleware之前):
MIDDLEWARE = [ # ... 其他中间件 'your_project_name.middleware.StaticJSGuardMiddleware', 'django.contrib.staticfiles.middleware.StaticFilesMiddleware', # ... ]
方法2:URL路由+自定义视图控制访问
若不想用中间件,可通过重写静态文件路由,用视图过滤请求:
在项目urls.py中添加以下配置:
from django.conf import settings from django.conf.urls.static import static from django.http import HttpResponseForbidden from django.views.static import serve def guarded_js_serve(request, path): is_minified_js = path.startswith('js/') and not path.startswith('js/js/') is_raw_js = path.startswith('js/js/') if settings.DEBUG: if is_minified_js: return HttpResponseForbidden("Minified JS access denied in DEBUG.") else: if is_raw_js: return HttpResponseForbidden("Raw JS access denied in production.") # 符合权限则返回静态文件 return serve(request, path, document_root=settings.STATIC_ROOT) # 覆盖默认静态文件路由,仅针对JS路径生效 urlpatterns = [ # ... 其他业务路由 ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT, view=guarded_js_serve)
注意:生产环境若用Nginx/Apache直接托管静态文件,此方法失效(请求不经过Django路由),需用方法3。
方法3:生产环境Web服务器直接配置拦截
如果生产环境用Nginx/Apache直接处理静态文件,可在服务器配置中添加访问规则,性能比Django处理更优:
Nginx配置示例
在静态文件location块中添加规则:
location /static/js/ { root /path/to/your/static/files; # 生产环境禁止访问可读JS目录 if ($request_uri ~* /static/js/js/) { return 403; } }
Apache配置示例
在虚拟主机配置或.htaccess中添加:
RewriteEngine On # 生产环境拦截可读JS请求 RewriteRule ^static/js/js/ - [F,L]
补充提示
- 若用
whitenoise托管静态文件,可结合方法1的中间件(放在whitenoise中间件之前即可)。 - 修改配置后需重启服务器,确保DEBUG模式切换生效。
内容的提问来源于stack exchange,提问作者Weilory
相关产品推荐
相关产品推荐

