Как получить 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)