From 041302d5d261fe1e71781efd703961eddea4cf01 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Tue, 24 May 2022 12:31:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8E=B7=E5=8F=96=20c?= =?UTF-8?q?ity=20=E6=97=B6=E5=8F=AF=E8=83=BD=E7=9A=84=E6=8A=A5=E9=94=99=20?= =?UTF-8?q?(#8294)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ibuler --- apps/common/utils/ip/geoip/utils.py | 6 +----- apps/common/utils/ip/ipip/utils.py | 13 ++++++------- apps/common/utils/ip/utils.py | 23 ++++++++++++++--------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/apps/common/utils/ip/geoip/utils.py b/apps/common/utils/ip/geoip/utils.py index 5e829f610..64752a3a1 100644 --- a/apps/common/utils/ip/geoip/utils.py +++ b/apps/common/utils/ip/geoip/utils.py @@ -13,10 +13,6 @@ reader = None def get_ip_city_by_geoip(ip): - if not ip or '.' not in ip or not isinstance(ip, str): - return _("Invalid ip") - if ':' in ip: - return 'IPv6' global reader if reader is None: path = os.path.join(os.path.dirname(__file__), 'GeoLite2-City.mmdb') @@ -32,7 +28,7 @@ def get_ip_city_by_geoip(ip): try: response = reader.city(ip) except GeoIP2Error: - return {} + return _("Unknown") city_names = response.city.names or {} lang = settings.LANGUAGE_CODE[:2] diff --git a/apps/common/utils/ip/ipip/utils.py b/apps/common/utils/ip/ipip/utils.py index ef97f4794..e94009b70 100644 --- a/apps/common/utils/ip/ipip/utils.py +++ b/apps/common/utils/ip/ipip/utils.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # import os -from django.utils.translation import ugettext as _ import ipdb @@ -11,13 +10,13 @@ ipip_db = None def get_ip_city_by_ipip(ip): global ipip_db - if not ip or not isinstance(ip, str): - return _("Invalid ip") - if ':' in ip: - return 'IPv6' if ipip_db is None: ipip_db_path = os.path.join(os.path.dirname(__file__), 'ipipfree.ipdb') ipip_db = ipdb.City(ipip_db_path) - - info = ipip_db.find_info(ip, 'CN') + try: + info = ipip_db.find_info(ip, 'CN') + except ValueError: + return None + if not info: + raise None return {'city': info.city_name, 'country': info.country_name} diff --git a/apps/common/utils/ip/utils.py b/apps/common/utils/ip/utils.py index e75ecb85c..d62cba00d 100644 --- a/apps/common/utils/ip/utils.py +++ b/apps/common/utils/ip/utils.py @@ -74,13 +74,18 @@ def contains_ip(ip, ip_group): def get_ip_city(ip): - info = get_ip_city_by_ipip(ip) - city = info.get('city', _("Unknown")) - country = info.get('country') + if not ip or not isinstance(ip, str): + return _("Invalid ip") + if ':' in ip: + return 'IPv6' - # 国内城市 并且 语言是中文就使用国内 - is_zh = settings.LANGUAGE_CODE.startswith('zh') - if country == '中国' and is_zh: - return city - else: - return get_ip_city_by_geoip(ip) + info = get_ip_city_by_ipip(ip) + if info: + city = info.get('city', _("Unknown")) + country = info.get('country') + + # 国内城市 并且 语言是中文就使用国内 + is_zh = settings.LANGUAGE_CODE.startswith('zh') + if country == '中国' and is_zh: + return city + return get_ip_city_by_geoip(ip)