Вы используете IP своего сервера для геолокации. Когда вы посещаете эту конкретную конечную точку, она принимает IP-адреса клиента, поэтому при развертывании приложения в Pythonanywhere клиент на этой конечной точке становится сервером.
Когда вы работали локально на вашем ПК, вы запрашивали конечную точку API, используя свой IP-адрес - поэтому, если вы переключились на VPN, ваш IP-адрес также изменился.
Чтобы исправить текущий код, вам нужно передать IP-адрес клиента конечной точке freegeoip.net/json
. Попробуйте это:
from flask import request
@app.route('/')
def index():
url = 'http://freegeoip.net/json/{}'.format(request.remote_addr)
r = requests.get(url)
j = json.loads(r.text)
city = j['city']
print(city)
Однако имейте в виду, что эта конечная точка API устарела и перестанет работать 1 июля 2018 года. Для получения дополнительной информации посетите: https://github.com/apilayer/freegeoip#readme - возможно, вы захотите начать использовать их новую услугу - мое решение все еще применимо к их новому API.
В некоторых случаях (например, в Pythonanywhere) перед вашим веб-приложением может находиться прокси-сервер, что делает request.remote_addr
бесполезным. В этом случае вы должны использовать заголовок X-Forwarded-For
. Не забудьте использовать правильное значение, хотя. Посмотрите на это хорошее решение для получения дополнительной информации .