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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:54:27