我正在创建一个 Flask 应用程序,在我的 routes.py 的这一部分中,我想使用 api.ipgeolocation.io 从他们的 IP 获取访问者的国家和城市,但出现错误 urllib.error.HTTPError: HTTP Error 423:锁定
import json
from urllib.request import urlopen
from flask import request
...
public_ip = request.remote_addr
url = 'https://api.ipgeolocation.io/ipgeo?apiKey=API_KEY&ip={}'.format(public_ip)
response = urlopen(url)
data = json.load(response)
country = data['country_name']
city = data['city']
我使用固定IP进行测试,例如。 8.8.8.8 有效。
url = 'https://api.ipgeolocation.io/ipgeo?apiKey=API_KEY&ip={}'.format("8.8.8.8")
>>>OUTPUT: United States, Mountain View
我不知道我错在哪里,任何帮助将不胜感激,谢谢。
我也遇到了同样的反应。对我来说,问题是我正在传递内部IP。我最终将调用包装在 try catch 中并“忽略”内部 IP,因为不需要包含它们。 HTH.
如果您位于 Web 服务器(或负载均衡器)后面,
request.remote_addr
将包含 Web 服务器的内部 IP 地址。
在这种情况下,您需要从 Web 服务器转发客户端的外部 IP 地址。
以 NGINX 为例,您需要在位置块中添加类似以下内容:
proxy_set_header X-Client-Address $remote_addr;
然后可以从请求头中读取
X-Client-Address
的值;