如何限制部署在Render上的Django Admin仅指定IP可访问?
限制Django Admin面板仅指定IP访问(Render基础套餐适用)
针对Render基础套餐无法直接用平台级防火墙限制IP的情况,推荐通过Django自定义中间件实现IP白名单控制,具体步骤如下:
方法一:自定义IP限制中间件
- 在你的Django项目根目录下创建
middleware.py文件,写入以下代码:
from django.http import HttpResponseForbidden # 替换成你自己的公网IP,可添加多个备用IP ALLOWED_ADMIN_IPS = ['123.45.67.89', '98.76.54.32'] class RestrictAdminIPMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 仅拦截admin路径的请求 if request.path.startswith('/admin/'): # 从Render传递的请求头中获取真实客户端IP client_ip = request.META.get('HTTP_X_REAL_IP') or \ request.META.get('HTTP_X_FORWARDED_FOR', '').split(',')[0].strip() or \ request.META.get('REMOTE_ADDR') # 检查IP是否在白名单内 if client_ip not in ALLOWED_ADMIN_IPS: return HttpResponseForbidden("无访问权限:你的IP不在Admin面板允许列表中") response = self.get_response(request) return response
- 在项目的
settings.py中,将这个中间件添加到MIDDLEWARE列表末尾:
MIDDLEWARE = [ # 保留原有的其他中间件... '你的项目名.middleware.RestrictAdminIPMiddleware', ]
- 确保
settings.py中配置了正确的代理头(Render部署必需):
USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
注意事项
- 你的公网IP可以通过搜索引擎查询“我的IP”获取,若使用动态IP,需定期更新白名单中的IP地址
- 部署到Render后,测试时用非允许IP访问
/admin/,应该会返回403禁止访问页面 - 此方法对所有admin路径生效,包括子页面,无需单独修改admin视图
内容的提问来源于stack exchange,提问作者DavidAlex99
相关产品推荐
相关产品推荐

