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

更新时间 2022-05-01 17:31:38

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观

大家好,我是小哈~

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

背景

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

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 并打印日志Flask 获取用户请求 IP 并打印日志