Flask 获取请求 IP 地址并打印日志(图文教程)

发布于: 2022-05-01 17:31:38 作者: 犬小哈 最新修订于: 2022-05-01 17:31:38

大家好,我是小哈~

本文给大家讲解下如何在 Flask 中获取请求者的 IP 地址,并打印日志。

背景

这些天,小哈闲来无聊用 Flask 搭建了个在线小工具,经过推广后,陆续有些用户访问了。每当用户访问首页时,打印了如下日志,非常之简陋:

Flask 访问首页打印日志

于是,想在日志里面追加一下访问者的 IP 地址。

场景一:服务器直接部署的 Flask

未加 Nginx 等代理服务器的情况下,通过如下方法获取请求 IP:

import logging
from flask import Flask, render_template, request

# Initialize the Flask application
app = Flask(__name__)

# Default route, print user's IP
@app.route('/')
def index():
	 ip = request.remote_addr
	 app.logger.info(f'==> 访问首页, ip: {ip} ...')
	 return render_template('index.html', user_ip=ip)


if __name__ == '__main__':
	 app.run(host="0.0.0.0", port=80)

场景二:Nginx + Flask

小哈的服务通过 Nginx + Flask 的模式来部署的,首先,需要在 Nginx 的配置文件里面加上下面配置, 将用户的真实 IP 以及代理 IP 放置到 header 头中:

location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr; # 用户的真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 用户代理IP
        proxy_pass http://172.17.0.1:8080; # 方向代理
}

这样,在 Flask 端,我们就可以通过 X-Real-IPX-Forwarded-For 来获取用户的 IP 信息了。

"""
首页
"""
@app.route('/')
def index():
    real_ip = request.headers.get('X-Real-IP')
    app.logger.info(f'==> 访问首页, ip: {real_ip} ...')
    return render_template('index.html')

下面是日志打印效果图, 已经可以看到用户的访问 IP 了:

Flask 获取用户请求 IP 并打印日志