Метод Socket API
см. https://stackoverflow.com/a/28950776/711085
Недостатки:
Метод рефлектора
(Обратите внимание, что это не отвечает на вопрос OP о локальном IP-адресе, например 192.168 ..., он дает вам общедоступный IP-адрес, который может быть более желательным в зависимости от варианта использования.)
Вы можете запросить какой-то сайт, например whatismyip.com (но с API), например:
from urllib.request import urlopen
import re
def getPublicIp():
data = str(urlopen('http://checkip.dyndns.com/').read())
# data = 'Current IP Check Current IP Address: 65.96.168.198\r\n'
return re.compile(r'Address: (\d+\.\d+\.\d+\.\d+)').search(data).group(1)
или использовать python2:
from urllib import urlopen
import re
def getPublicIp():
data = str(urlopen('http://checkip.dyndns.com/').read())
# data = 'Current IP Check Current IP Address: 65.96.168.198\r\n'
return re.compile(r'Address: (\d+\.\d+\.\d+\.\d+)').search(data).group(1)
Преимущества:
Недостатки (и обходные пути):
изменить : Хотя изначально я думал, что эти методы были очень плохими (если вы не используете много резервных копий, код может быть неактуальным через много лет), он задает вопрос «что такое интернет?». Компьютер может иметь множество интерфейсов, указывающих на множество разных сетей. Для более подробного описания темы google для gateways and routes
. Компьютер может иметь доступ к внутренней сети через внутренний шлюз или получить доступ к всемирной сети через шлюз, например, для маршрутизатора (как правило, для случая). Локальный IP-адрес, о котором спрашивает OP, только четко определен в отношении одного уровня связи, поэтому вы должны указать, что («это сетевая карта или кабель Ethernet, о котором мы говорим?») , На этот вопрос может быть несколько неповторимых ответов. Однако глобальный IP-адрес во всемирной сети, вероятно, хорошо определен (в отсутствие массивной фрагментации сети): возможно, путь возврата через шлюз, который может получить доступ к TLD.
Я использую Postgres. Не уверен, работает ли это решение для других баз данных. Таблица people используется в качестве примера - не забудьте изменить имя таблицы на свое.
def up
change_column :people, :permanent, 'integer USING CAST(permanent AS integer)'
Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 0 THEN 1 WHEN 1 THEN 2 END")
end
def down
Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 1 THEN 0 WHEN 2 THEN 1 END")
change_column :people, :permanent, 'boolean USING CAST(permanent AS boolean)'
end