You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何根据DEBUG模式限制静态JS文件的访问权限?

解决方案

方法1:自定义中间件拦截静态文件请求

写一个全局中间件,根据DEBUG状态拦截不符合权限的静态文件请求,一次配置覆盖所有App:

  1. 在项目根目录创建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
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:55:39