背景:
在本地使用自带webUI的项目时,需要制定webUI的访问地址。
- 一般本地访问使用:
127.0.0.1
, - 配置为可以从其他设备访问时,需要指定当前设备的IP,或者指定为
0.0.0.0
。
例如:使用locust的时候,因为某些特殊原因,我的电脑名称中有中文字符。当指定webUI访问地址指定为0.0.0.0
时,locust webUI 会调用的 pywsgi.WSGIServer
服务。
初始化启动时,因为指定的IP时0.0.0.0
, 会调用socket.getfqdn()
方法。由于电脑名为中文,会由于默认的ascii
编码方式,导致抛出异常。
从代码逻辑上讲,我们指定了0.0.0.0
后,会先调用socket.gethostname()
,然后通过设备名称获取IP地址。本质上还是重新指定IP。
如果我们一开始就指定为设备的IP,会更有效率。
获取设备IP的方法:
- 以下方法的使用都是基于当前设备已经连接网络。
方法一:
使用 socket
方法:
def current_ip():
ip = None
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.connect(('8.8.8.8', 80))
ip,port = client.getsockname()
print(f'ip: {ip}')
return ip
方法二:
使用 psutil
方法:
-
kind='inet4'
指定过滤出IPv4的连接文章来源:https://www.toymoban.com/news/detail-797663.html -
通过连接类型
SOCK_STREAM
、状态不为None
、连接的远端IP不为空且不为127.0.0.1
文章来源地址https://www.toymoban.com/news/detail-797663.htmldef current_ip(): import psutil ip = None interfaces = psutil.net_connections(kind='inet4') for interface in interfaces: if interface.type == socket.SocketKind.SOCK_STREAM and interface.status is not None and bool(interface.raddr): if interface.raddr.ip != "127.0.0.1": print(interface.laddr.ip) ip = interface.laddr.ip break return ip
到了这里,关于获取当前设备的IP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!