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
python
# -*- 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()的示例:
python
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字符串。
范例:
python
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
python
# -*- 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
python
'''
统一拦截处理和统一错误处理
'''
from web.interceptors.AuthInterceptor import *
from web.interceptors.ErrorInterceptor import *
web/templates/error/error.html
python
{% 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 %}