Flask 获取请求 IP 地址并打印日志(图文教程)
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 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 搭建了个在线小工具,经过推广后,陆续有些用户访问了。每当用户访问首页时,打印了如下日志,非常之简陋:
于是,想在日志里面追加一下访问者的 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-IP
和 X-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 了: