Django本地开发如何在settings.py动态获取带端口访问域名URL
如何在Django项目settings.py中动态获取访问域名URL
核心实现思路
settings.py是Django启动阶段加载的全局配置文件,加载时没有请求上下文,无法直接获取真实访问域名,但本地开发场景下可以通过解析runserver启动参数拿到监听端口,配合根路径写法的静态地址解决问题,全程不会触发应用未加载的错误。
具体实现代码
首先在settings.py中添加启动参数解析逻辑,补全原有配置:
import sys import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent # 保留原有settings里的其他配置,比如默认的STATIC_URL = "/static/" # 动态解析本地runserver服务地址 LOCAL_DEV_ROOT = "http://localhost" DEFAULT_PORT = "8000" # 识别runserver启动命令 if len(sys.argv) >= 2 and sys.argv[1] == "runserver": # 读取启动时传入的地址参数,格式为 0:端口/IP:端口 addr_param = sys.argv[2] if len(sys.argv) >= 3 else f"127.0.0.1:{DEFAULT_PORT}" run_port = addr_param.split(":")[-1] if ":" in addr_param else DEFAULT_PORT else: run_port = DEFAULT_PORT LOCAL_FULL_DOMAIN = f"{LOCAL_DEV_ROOT}:{run_port}" # If in local dev if "RDS_DB_NAME" not in os.environ: # 覆写第三方包的CDN配置为本地静态资源 BOOTSTRAP5 = { "css_url": { # 推荐写法:根路径开头的绝对静态地址,自动适配当前访问域名/端口,兼容局域网IP访问场景 "href": "/static/css/bootstrap.min.css", # 若依赖包强制要求完整URL,可使用拼接好的本地域名 # "href": f"{LOCAL_FULL_DOMAIN}/static/css/bootstrap.min.css", } }
关键注意事项
- 之前出现静态路径拼接到app子目录的问题,核心原因是写的
static/css/bootstrap.min.css是相对路径,浏览器会基于当前页面的路径做解析;换成开头带/的根绝对路径后,会直接从站点根目录拼接静态地址,完全匹配runserver提供的全局静态资源路由 - 不要用
os.path.join(BASE_DIR, ...)拼接Web访问路径,这个方法拼的是服务器本地磁盘路径,和浏览器访问的URL路径不是一个概念 - 解析
sys.argv拿启动端口的逻辑不依赖任何Django应用模块,在settings加载阶段就能执行,不会抛出AppRegistryNotReady错误 - 该逻辑只在无
RDS_DB_NAME环境变量的本地开发环境生效,不影响生产环境的CDN配置 - 不需要使用
reverse方法或static模板标签,只要保持STATIC_URL = "/static/"的默认配置,根路径写法的静态地址就能正常命中静态资源路由
内容的提问来源于stack exchange,提问作者chris Frisina
相关产品推荐
相关产品推荐

