Django 基于环境变量实现URL重定向或禁用的方法
生产环境禁用指定URL的配置方案
完全可以在不修改urls.py中urlpatterns原有配置的前提下实现需求,以下是两种常用的纯配置方案:
方案1:Web服务器层配置(无代码侵入,纯环境配置)
这是最推荐的方式,不需要修改项目代码,直接在生产环境的Web服务配置中添加拦截规则即可,以Nginx为例:
# 匹配所有需要禁用的路由前缀,可自行修改正则规则 location ~ ^/(internal-dev|beta-unreleased|test-feature)/ { return 404; # 如需返回503状态码则替换为 return 503; }
注:505状态码语义为HTTP版本不支持,未发布功能建议优先使用404(资源不存在)或503(服务暂不可用),更符合HTTP协议规范
方案2:Django应用层环境变量控制
如果不方便修改Web服务配置,可通过项目环境变量+轻量中间件实现,全程不需要调整原有路由配置:
- 第一步:在生产环境的环境变量配置文件(如
.env)中添加需要禁用的路由列表:DISABLED_URLS=/internal-dev/,/beta-unreleased/,/test-feature/ - 第二步:新增路由拦截中间件,代码示例如下:
import os from django.http import Http404 # 如需返回503可引入 HttpResponse 类 # from django.http import HttpResponse class DisabledUrlInterceptorMiddleware: def __init__(self, get_response): self.get_response = get_response # 从环境变量读取禁用路由前缀列表,空值则不拦截任何路由 self.disabled_prefixes = [i.strip() for i in os.getenv("DISABLED_URLS", "").split(",") if i.strip()] def __call__(self, request): # 匹配当前请求路径是否属于禁用范围 for prefix in self.disabled_prefixes: if request.path.startswith(prefix): raise Http404 # 如需返回503则替换为 return HttpResponse(status=503) return self.get_response(request)
- 第三步:在
settings.py的MIDDLEWARE列表最顶部注册该中间件即可。
不同环境仅需要调整DISABLED_URLS环境变量的值即可,开发环境留空就不会触发拦截规则,完全不需要修改原有路由配置。
内容的提问来源于stack exchange,提问作者hckrman
相关产品推荐
相关产品推荐

