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

如何在Django中获取当前监听的本地IP地址?

在Django中获取服务监听IP并用于日志格式

方法一:解析runserver命令行参数

当你通过python manage.py runserver 192.168.1.200:8000指定监听IP启动服务时,可以直接从命令行参数中提取该IP,代码实现如下:

import sys

def get_listen_ip():
    # 遍历命令行参数,定位runserver后的地址信息
    for idx, arg in enumerate(sys.argv):
        if arg == 'runserver' and idx + 1 < len(sys.argv):
            addr_port = sys.argv[idx + 1]
            # 拆分IP与端口,只保留IP部分
            ip = addr_port.split(':')[0]
            return ip
    # 未指定IP时返回默认本地地址
    return '127.0.0.1'

将该IP注入到日志格式中,可通过日志过滤器实现:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'custom': {
            # 日志格式中加入监听IP字段
            'format': '%(asctime)s [%(listen_ip)s] %(levelname)s %(message)s',
        },
    },
    'filters': {
        'inject_listen_ip': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': lambda record: setattr(record, 'listen_ip', get_listen_ip()),
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'custom',
            'filters': ['inject_listen_ip'],
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO',
    },
}

方法二:自动获取本地网卡IP(适用于0.0.0.0启动场景)

如果启动命令是python manage.py runserver 0.0.0.0:8000(监听所有网卡),可以通过socket获取当前机器的实际对外IP:

import socket

def get_local_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        # 连接公共DNS服务器(无需实际连通)以获取本机出口IP
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    except Exception:
        ip = '127.0.0.1'
    finally:
        s.close()
    return ip

只需将上述get_listen_ip()替换为get_local_ip(),即可在日志中显示实际服务的访问IP。

注意事项

  • 若启动时未指定IP(仅python manage.py runserver),默认监听127.0.0.1,此时两种方法都会返回该地址
  • 若服务部署在多网卡机器上,get_local_ip()会返回当前默认路由对应的出口IP

内容的提问来源于stack exchange,提问作者Majoris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:50:01