DevGang
Авторизоваться

Как получить 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)
#Flask #Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу