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 AppErrorLog

class LogService():
    @staticmethod
    def addAccessLog():
        target = AppAccessLog()
        #target_url  访问的url
        target.target_url = request.url
        #referer_url 当前访问的refer
        target.referer_url = request.referrer
        # remote  adj,(计算机)远程的、遥控的
        target.ip = request.remote_addr
        target.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

    @staticmethod
    def addErrorLog( content ):
        if 'favicon.ico' in request.url:
            return
        target = AppErrorLog()
        target.target_url = request.url
        target.referer_url = request.referrer
        target.query_params = json.dumps(request.values.to_dict())
        target.content = content
        target.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 json

data = {
    '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 %}