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


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

欢迎加入小哈的星球,你将获得:专属的实战项目(4个项目都能学) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书

  • 《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于 Spring AI + Spring Boot 3.x + JDK 21...查看介绍

  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...查看介绍;演示链接:http://116.62.199.48:7070/

  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/

  • 新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍

截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观

大家好,我是小哈~

本文给大家讲解下如何在 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 并打印日志