当前位置: 首页 > news >正文

Flask 日志

flask 日志  代码源码源自编程浪子flask点餐小程序代码

记录用户访问日志错误日志

这段代码是一个基于Flask框架的日志服务类,用于  记录用户访问日志错误日志。代码中定义了一个名为LogService的类,其中包含了两个静态方法:addAccessLog 和 addErrorLog

addAccessLog方法用于记录用户的访问日志。在该方法中:

首先创建一个AppAccessLog实例化对象target,并将请求的URL、引用URL、IP地址、查询参数等信息赋值给相应的属性。如果当前用户已登录,则将用户ID也赋值给uid属性。然后获取请求的User-Agent,并赋值给ua属性。最后,将target对象添加到数据库会话中,并提交事务。


addErrorLog方法用于记录错误日志。在该方法中:

首先判断请求的URL是否为favicon.ico,如果是则直接返回。然后创建一个AppErrorLog对象target,并将请求的URL、引用URL、查询参数、错误内容等信息赋值给相应的属性。最后,将target对象添加到数据库会话中,并提交事务。

这段代码的作用是在用户访问网站时记录访问日志错误日志,以便后续进行分析和排查问题

common/libs/LogService.py

# -*- coding: utf-8 -*-
from flask import request,g
from application import app,db
import json
from common.libs.Helper import getCurrentDate
from common.models.log.AppAccessLog import AppAccessLog
from common.models.log.AppErrorLog import AppErrorLogclass LogService():@staticmethoddef addAccessLog():target = AppAccessLog()#target_url  访问的urltarget.target_url = request.url#referer_url 当前访问的refertarget.referer_url = request.referrer# remote  adj,(计算机)远程的、遥控的target.ip = request.remote_addrtarget.query_params = json.dumps(  request.values.to_dict() )if 'current_user' in g and g.current_user is not None:target.uid = g.current_user.uid#  Unified Architecture   ua 统一架构    target.ua = request.headers.get( "User-Agent" )target.created_time = getCurrentDate()db.session.add( target )db.session.commit( )return True@staticmethoddef addErrorLog( content ):if 'favicon.ico' in request.url:returntarget = AppErrorLog()target.target_url = request.urltarget.referer_url = request.referrertarget.query_params = json.dumps(request.values.to_dict())target.content = contenttarget.created_time = getCurrentDate()db.session.add(target)db.session.commit()return True

问题0:该flask代码中,request值是如何包含这么多值的? 如何给request设置这么多值?

Flask中的request对象是一个全局对象,它包含了HTTP请求的所有信息,包括URL、请求方法、请求头、请求参数等等。这些值是由Flask框架自动解析和设置的,无需手动设置。

在Flask中,request对象的属性和方法可以用来获取和操作请求的各个部分。下面是一些常用的request属性和方法:

  • request.url:获取当前请求的URL。
  • request.method:获取当前请求的方法,如GET、POST等。
  • request.headers:获取当前请求的头部信息。
  • request.values:获取当前请求的参数,包括GET和POST请求的参数。
  • request.args:获取当前请求的GET参数。
  • request.form:获取当前请求的POST参数。
  • request.cookies:获取当前请求的Cookie。
  • request.files:获取当前请求上传的文件。

在上述代码中,request对象的属性和方法被用来获取和设置日志记录的相关信息,如请求的URL、Referer、参数等。这些信息可以用于记录访问日志和错误日志,以便后续的分析和排查问题。

问题1:  json.dumps()函数地作用是什么?

json.dumps()是一个Python库中的函数,用于将Python数据结构转换为JSON格式的字符串。它接受一个Python对象作为参数,并返回一个JSON格式的字符串表示该对象。

以下是一个使用json.dumps()的示例:

import jsondata = {'name': 'myname','age': 100
}json_str = json.dumps(data)
print(json_str)  # 输出:{"name": "myname", "age": 100}

在上面的示例中,我们将一个包含’name’和’age’键值对的字典对象转换为JSON字符串。

问题2: to_dict()方法的作用是什么?

to_dict()是一个方法,用于将request.values对象转换为字典形式。在json.dumps()函数中,request.values.to_dict()将返回一个字典对象,然后json.dumps()将该字典对象序列化为一个JSON字符串。

范例:

import json# 假设request.values是一个包含键值对的对象
data = request.values.to_dict()# 将data转换为JSON字符串
json_data = json.dumps(data)print(json_data)

这段代码将request.values对象转换为字典形式,并使用json.dumps()将其序列化为一个JSON字符串。最后,打印出该JSON字符串。

展示错误及错误引导:

web/interceptors/ErrorInterceptor.py

# -*- coding: utf-8 -*-
from application import  app
from common.libs.Helper import ops_render
from common.libs.LogService import LogService@app.errorhandler( 404 )
def error_404( e ):LogService.addErrorLog( str( e ) )return ops_render( 'error/error.html',{ 'status':404,'msg':'很抱歉!您访问的页面不存在' } )

LogService.addErrorLog(str(e))  以字符串的形式将这个错误传递到LogService里去

@app.errorhandler(404)是Flask框架中的一个装饰器,用于定义当发生404错误时的处理函数。具体来说,当用户访问一个不存在的路由时,Flask会自动调用被@app.errorhandler(404)修饰的函数来处理该错误,并返回一个自定义的错误页面或错误信息给前端。

d

www.py

'''
统一拦截处理和统一错误处理
'''
from web.interceptors.AuthInterceptor import  *
from web.interceptors.ErrorInterceptor import  *

web/templates/error/error.html

{% extends "common/layout_user.html" %}
{% block content %}<div class="row"><div class="panel panel-default gray-bg text-center" style="min-height: 600px;line-height: 600px;"><div class="panel-body gray-bg" style="font-size: 18px;"><p>{{ msg }},<a href="{{ buildUrl('/') }}">返回首页</a></p></div></div></div>
{% endblock %}


相关文章:

  • 第十一章 Stream消息驱动
  • 5个用于构建Web应用程序的Go Web框架
  • 【记录】开始学习网络安全
  • go slice源码探索(切片、copy、扩容)和go编译源码分析
  • SASS循环
  • Qt+Opencv:人脸检测
  • Unity | 快速修复Animation missing错误
  • Android 跨进程之间通信(IPC)方式之ContentProvider
  • 信号处理设计模式
  • 【Linux】修复 Linux 错误 - 权限被拒绝
  • Pycharm引用其他文件夹的py
  • docker学习(十九、network使用示例bridge)
  • 16-网络安全框架及模型-BiBa完整性模型
  • TypeError: control character ‘delimiter‘ cannot be a newline (`\r` or `\n`)
  • OpenGL FXAA抗锯齿算法(Qt)
  • ES6指北【2】—— 箭头函数
  • Git的一些常用操作
  • HTML5新特性总结
  • JavaScript中的对象个人分享
  • Java读取Properties文件的六种方法
  • pdf文件如何在线转换为jpg图片
  • PHP 的 SAPI 是个什么东西
  • 官方解决所有 npm 全局安装权限问题
  • 解决iview多表头动态更改列元素发生的错误
  • 入门级的git使用指北
  • 什么软件可以剪辑音乐?
  • 使用 Docker 部署 Spring Boot项目
  • 数组大概知多少
  • Spring Batch JSON 支持
  • 第二十章:异步和文件I/O.(二十三)
  • ​​​​​​​​​​​​​​Γ函数
  • #pragma once与条件编译
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (八)c52学习之旅-中断实验
  • (分布式缓存)Redis持久化
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)基于IDEA的JAVA基础1
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .htaccess 强制https 单独排除某个目录
  • .Net Web项目创建比较不错的参考文章
  • .net 获取url的方法
  • .NET 指南:抽象化实现的基类
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /3GB和/USERVA开关
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /var/log/cvslog 太大
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @RequestMapping用法详解
  • @Service注解让spring找到你的Service bean
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce