Как получить IP-адрес пользователя с помощью Flask?
 
        Flask - одна из самых популярных сред веб-разработки на Python. Это легкий веб-фреймворк, но он предлагает множество встроенных методов, которые можно использовать для беспроблемного развертывания эффективных веб-приложений.
В этом руководстве мы получим IP-адрес пользователя, который посещает веб-приложение, созданное с помощью Flask.
Мы создадим простой REST API, который обрабатывает входящие запросы к  /, возвращая IP-адрес пользователя в качестве ответа.
Создание простого веб-приложения с помощью Flask
Создайте новый проект Flask для этого руководства. Мы создадим базовое приложение, которое возвращает «Hello World» с запросами к /:
from flask import Flask
# Creating the instance of the class Flask
app = Flask(__name__)
# Using the decorator to create the URL for the web application
@app.route('/')
# The function will return the information displayed on the webpage
def hello_world():
    return '<h1> Hello World</h1>'
# Run the application
if __name__ == '__main__':
    app.run(debug=True)
Теперь, когда у нас настроено наше приложение, давайте соберем IP-адреса, связанные с запросом пользователя.
Как узнать IP-адрес пользователя во Flask?
Всякий раз, когда клиент запрашивает страницу - он отправляет HTTP-запрос GET с определенной полезной нагрузкой. Среди другой информации - их отличительный IP-адрес. Во Flask - каждый маршрут имеет доступ к переменной request, которая представляет входящий запрос от пользователя.
Из этого request мы можем извлекать различные элементы - и IP-адрес обозначается как свойство remote_addr:
@app.route('/')
def hello_world():
    ip_addr = request.remote_addr
    return '<h1> Your IP address is:' + ip_addr
Мы также можем получить удаленный адрес через среду контекста запроса. Словарь environ на объекте request содержит различные ключи и соответствующие им значения, относящиеся к запросу. REMOTE_ADDR одна из переменных (ключей) сервера, которая отображает IP-адрес клиента или сервера:
@app.route('/client')
def client():
    ip_addr = request.environ['REMOTE_ADDR']
    return '<h1> Your IP address is:' + ip_addr
Но два вышеуказанных варианта не будут работать, если ваш пользователь делает запрос через прокси. В этом случае мы должны проверить заголовки запроса. В частности, ищем заголовок HTTP_X_FORWARDED_FOR:
@app.route('/proxy-client')
def proxy_client():
    ip_addr = request.environ['HTTP_X_FORWARDED_FOR']
    return '<h1> Your IP address is:' + ip_addr
Теперь даже этот подход не будет работать, если заголовок не установлен. Таким образом, распространенной стратегией является использование метода get(), чтобы, если заголовок не установлен, мы могли по умолчанию использовать внешний адрес:
@app.route('/proxy-client')
def proxy_client():
    ip_addr = request.environ.get('HTTP_X_FORWARDED_FOR', request.remote_addr)
    return '<h1> Your IP address is:' + ip_addr
Примечание. При попытке получить значение из несуществующего ключа возвращается None. Методget()классаdictпозволяет установить значение по умолчанию, который будет использоваться, еслиget()не удается найти ключ.
Имея это в виду, мы можем выбрать любой из следующих трех подходов для получения IP-адреса пользователя через его входящий запрос:
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world():
    ip_addr = request.remote_addr
    return '<h1> Your IP address is:' + ip_addr
@app.route('/client')
def client():
    ip_addr = request.environ['REMOTE_ADDR']
    return '<h1> Your IP address is:' + ip_addr
@app.route('/client')
def proxy_client():
    ip_addr = request.environ.get('HTTP_X_FORWARDED_FOR', request.remote_addr)
    return '<h1> Your IP address is:' + ip_addr
if __name__ == '__main__':
    app.run(debug=True)