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

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

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

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

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 66w+ 字,讲解图 2896+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2300+ 小伙伴加入学习 ,欢迎点击围观

大家好,我是小哈~

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