在Flask中记录用户端的完整访问记录,包括请求和响应信息以及用户访问IP

ops/2024/10/21 0:57:35/

在Flask中记录用户端的完整访问记录,包括请求和响应信息以及用户访问IP,可以通过自定义中间件(或称为请求预处理和后处理函数)来实现。Flask本身提供了装饰器和信号机制来帮助我们实现这一功能。

以下是一个基本的实现步骤:

  1. 创建一个Flask应用
    首先,你需要有一个Flask应用。

  2. 定义日志记录器
    使用Python的logging模块来创建一个日志记录器,配置它将日志写入文件或其他你希望的地方。

  3. 使用before_requestafter_request装饰器
    Flask提供了before_requestafter_request装饰器,它们允许你在每个请求之前和之后执行特定的代码。

  4. 记录请求信息
    before_request函数中,你可以从flask.request对象中获取请求信息,如IP地址、请求头、请求方法等,并将这些信息记录到日志中。

  5. 记录响应信息
    after_request函数中,你可以从传递给该函数的响应对象中获取响应状态码、响应头等信息,并将它们记录到日志中。注意,after_request函数应该返回响应对象,以便它继续被传递给下一个后处理函数(如果有的话)或最终发送给客户端。

  6. 处理异常
    你可能还想记录任何在请求处理过程中抛出的异常。为此,你可以使用Flask的errorhandler装饰器来捕获并处理特定类型的异常,或者使用一个全局的异常处理机制(如通过注册一个teardown_request函数)。

以下是一个简单的示例代码:

python">import logging
from flask import Flask, request, response, jsonifyapp = Flask(__name__)# 配置日志记录器
logging.basicConfig(filename='access.log', level=logging.INFO, format='%(asctime)s - %(message)s')# 请求前的处理
@app.before_request
def log_request_info():ip = request.remote_addrmethod = request.methodurl = request.urlheaders = request.headersbody = request.get_data() if request.is_json else request.form.to_dict() if request.form else {}logging.info(f"Request: IP={ip}, Method={method}, URL={url}, Headers={headers}, Body={body}")# 请求后的处理
@app.after_request
def log_response_info(response):status = response.status_codeheaders = response.headers# 注意:这里不直接记录响应体,因为它可能是大文件或二进制数据# 如果需要记录,可以在返回给客户端之前先获取并记录它logging.info(f"Response: Status={status}, Headers={headers}")return response# 示例路由
@app.route('/')
def index():return jsonify({"message": "Hello, World!"})if __name__ == '__main__':app.run(debug=True)

注意

  • 在上面的代码中,request.get_data()用于获取原始请求体,这通常适用于非JSON请求。对于JSON请求,你可以使用request.get_json()来获取解析后的JSON对象。但是,请注意request.get_json()在没有JSON数据时可能返回None,所以你可能需要添加一些额外的逻辑来处理这种情况。
  • after_request中,我们没有直接记录响应体,因为响应体可能非常大(例如,包含文件下载)或可能是二进制数据。如果你确实需要记录响应体,你应该在返回给客户端之前先获取并记录它(但要小心不要引入性能问题或内存泄漏)。
  • 上面的代码示例使用了基本的日志配置,你可能需要根据自己的需求调整日志格式、级别和输出位置。
  • 在生产环境中,你可能还想使用更高级的日志处理工具(如Loguru、ELK Stack等)来管理和分析日志数据。

http://www.ppmy.cn/ops/127132.html

相关文章

搭建LeNet-5神经网络,并搭建自己的图像分类训练和测试的模板,模板通用!!!均有详细注释。

本文任务: 1、构建LeNet神经网络。 2、搭建图像分类训练和测试的通用模板。 3、训练出自己的模型。 4、验证模型效果。 LeNet论文地址:原文地址http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks…

爬虫逆向学习(十二):一个案例入门补环境

此分享只用于学习用途,不作商业用途,若有冒犯,请联系处理 反爬前置信息 站点:aHR0cDovLzEyMC4yMTEuMTExLjIwNjo4MDkwL3hqendkdC94anp3ZHQvcGFnZXMvaW5mby9wb2xpY3k 接口:/xjzwdt/rest/xmzInfoDeliveryRest/getInfoDe…

git clone 鉴权失败

git clone 鉴权失败问题 1. 问题描述2. 解决方法 1. 问题描述 使用git clone自己的代码报如下错误: 正克隆到 xxx... Username for https://github.com: Password for https://xxxgithub.com: remote: Support for password authentication was removed on Augu…

【Flutter】页面布局:线性布局(Row 和 Column)

在 Flutter 中,布局(Layout)是应用开发的核心之一。通过布局组件,开发者可以定义应用中的控件如何在屏幕上排列。Row 和 Column 是 Flutter 中最常用的两种线性布局方式,用于水平和垂直排列子组件。在本教程中&#xf…

Unity中通过给定的顶点数组生成凸面体的方法参考

这里我们使用了Quickhull for Unity插件,其实就是一个ConvexHullCalculator.cs文件,代码如下: /*** Copyright 2019 Oskar Sigvardsson** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software…

部署服务dockerfile失败小记

首先是碰到在ENTRYPOINT 中添加参数问题,一时懵逼直接添加到最后 ENTRYPOINT [“java”,“-jar”,“xx-xx.jar”,“–spring.profiles.active${envType}”,“–add-opens java.base/java.langALL-UNNAMED”,“–add-opens java.base/java.utilALL-UNNAMED”, “–a…

PHP政务招商系统——高效连接共筑发展蓝图

政务招商系统——高效连接,共筑发展蓝图 🏛️ 一、政务招商系统:开启智慧招商新篇章 在当今经济全球化的背景下,政务招商成为了推动地方经济发展的重要引擎。而政务招商系统的出现,更是为这一进程注入了新的活力。它…

设计模式(c++)

设计模式通常分为三大类: 创建型模式(Creational Patterns):负责对象创建的机制,主要解决对象创建过程中的复杂性和灵活性问题。 结构型模式(Structural Patterns):负责处理类或对象…