基于Django v4.0的整站(含静态文件)访问控制方案咨询
实现Django整站访问控制(含静态文件)的方案
核心思路
通过自定义中间件拦截所有请求(包括静态文件),验证请求中携带的访问码是否与环境变量中的值一致,不一致则返回未授权页面。
具体实现步骤
1. 配置环境变量
在Heroku应用设置中添加环境变量SITE_ACCESS_CODE,设置你的专属访问码。本地开发可在.env文件中添加:
SITE_ACCESS_CODE=your_strong_access_code_here
2. 创建自定义中间件
在项目中新建中间件文件middleware/site_access_middleware.py,代码如下:
import os from django.http import HttpResponseForbidden class SiteAccessControlMiddleware: def __init__(self, get_response): self.get_response = get_response self.valid_code = os.environ.get('SITE_ACCESS_CODE') # 可添加无需验证的路径,比如健康检查接口 self.exempt_paths = ['/health-check/'] def __call__(self, request): # 跳过豁免路径的验证 if request.path in self.exempt_paths: return self.get_response(request) # 从URL参数或Cookie获取访问码 access_code = request.GET.get('access_code') or request.COOKIES.get('site_access') if not access_code or access_code != self.valid_code: return HttpResponseForbidden("请提供有效的访问码") response = self.get_response(request) # 验证通过后设置Cookie,避免重复输入(有效期1天) response.set_cookie('site_access', access_code, max_age=86400) return response
3. 注册中间件
在settings.py的MIDDLEWARE列表最上方添加自定义中间件,确保优先拦截所有请求:
MIDDLEWARE = [ 'your_project_name.middleware.site_access_middleware.SiteAccessControlMiddleware', # 其他中间件按原有顺序保留 'whitenoise.middleware.WhiteNoiseMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # ... ]
4. 确保静态文件受控制
Heroku上静态文件默认由whitenoise托管,需将WhiteNoiseMiddleware放在自定义中间件之后,保证静态文件请求也经过访问码验证。
5. 功能验证
- 本地启动项目,直接访问页面会返回403未授权
- 访问
http://localhost:8000/?access_code=your_strong_access_code_here,验证通过后会自动设置Cookie,后续访问无需重复输入 - 部署到Heroku后,确认环境变量已配置,重复上述测试流程
注意事项
- 访问码需设置为高强度字符串,降低被猜测风险
- 豁免路径可根据实际需求调整,比如
robots.txt或监控接口 - 生产环境必须配合HTTPS使用,防止访问码在传输过程中被窃取
- 若需支持多访问码或动态管理,可扩展中间件从数据库读取有效码列表
内容的提问来源于stack exchange,提问作者SimpleNibble
相关产品推荐
相关产品推荐

