如何在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
相关产品推荐
相关产品推荐

