Django记录操作日志、LogEntry的使用
LogEntry是在后台开发中经常用到的模块,它在admin是默认开启的。
可以使用LogEntry模块记录所有用户的操作记录。一方面可以用来监督,另一方面可以用来做回滚。
1. 使用LogEntry
ModelAdmin本身就有日志记录功能。当新建一个实体(Post、Category、Tag)时,ModelAdmin会创建一条变更日志记录。当修改一条内容时,ModelAdmin又会调用LogEntry来创建一条日志,记录这个变更。
ModelAdmin内部提供了两个方法,分别是log_addition和log_change。
log_addition记录新增日志。
log_change记录变更日志。
我们可以看它们的定义来学习LogEntry模块
代码位置:django/admin/contrib/options.py
def log_addition(self, request, object, message):
"""
Log that an object has been successfully added. The default implementation creates an admin LogEntry object.
"""
from django.contrib.admin.models import LogEntry, ADDITION
return LogEntry.objects.log_action(
user_id=request.user.pk,
content_type_id=get_content_type_for_model(object).pk,
object_id=object.pk,
object_repr=str(object),
action_flag=ADDITION,
change_message=message,
) def log_change(self, request, object, message):
"""
Log that an object has been successfully changed. The default implementation creates an admin LogEntry object.
"""
from django.contrib.admin.models import LogEntry, CHANGE
return LogEntry.objects.log_action(
user_id=request.user.pk,
content_type_id=get_content_type_for_model(object).pk,
object_id=object.pk,
object_repr=str(object),
action_flag=CHANGE,
change_message=message,
)
从以上代码可以看出:这两个方法都调用了LogEntry.objects.log_action方法,只是参数略有不同,可以看到,如果需要自定义变更记录的话,只需要传递对应的参数即可。以下简要介绍一下这些参数。
user_ id
当前用户id。
content_type_id
要保存内容的类型,上面的代码中使用的是get_.content_type_for_model方法拿到对应Model的类型id。这可以简单理解为ContentType为每个Model定义了一个类型id。
object_id
记录变更实例的id,比如PostAdmin中它就是post. id。
object_repr
实例的展示名称,可以简单理解为我们定义的__str__所返回的内容。
action flag
操作标记。admin的Model里面定义了几种基础的标记: ADDITION、CHANGE和DELETION。它用来标记当前参数是数据变更、新增,还是删除。
change_ message
这是记录的消息,可以自行定义。我们可以把新添加的内容放进去(必要时可以通过这里来恢复),也可以把新旧内容的区别放进去。
理解了这几个参数,如果遇到类似的需求,就能直接使用Django现成的工具来完成了。
2. 查询某个对象的变更
上面我们知道如何记录某个对象的变更日志了,那么问题来了,如何在询已经记录的变更呢?
其实这是简单的Model查询问题。假设我们记录的对象是Post的操作,现在来获取Post中id为1的所有变更日志,大概代码如下:
from django.contrib.admin.models import LogEntry, CHANGE
from django.contrib.admin.options import get_content_type_for_model post = Post.objects.get(id=1)
log_entries = LogEntry.objects.filter(
content_type_id=get_content_type_for_model(post).pk,
object_id=post.id,
这样我们就拿到了文章id为1的所有变更记录了。
3. 在admin页面上查看操作日志
我们既知道如何记录变更日志,也知道如何获取变更日志,那么如何才能够在admin后台方便地查看操作日志呢?
新增如下配置:
#最上面增加import
from django.contrib.admin.models import LogEntry
#文件最下方增加
@adnin.register(LogEntry, site=custom_site)
class LogEntryAdmin(admin.ModelAdmin):
list_display = ['object_repr','object_ id','action_flag','user','change_message']
如果你配置过xadmin,则在adminx.py进行配置:
#最上面增加import
from django.contrib.admin.models import LogEntry
#文件最下方增加
xadmin.site.register(LogEntry,LogEntryAdmin)
class LogEntryAdmin(object):
list_display = ['object_repr','object_id','action_flag','user','change_message']
这样就可以看到所有的变更记录了。如下图所示:

Django记录操作日志、LogEntry的使用的更多相关文章
- Appfuse:记录操作日志
appfuse的数据维护操作都发生在***form页面,与之对应的是***FormController,在Controller中处理数据的操作是onSubmit方法,既然所有的操作都通过onSubmi ...
- MVC 记录操作日志与过滤特殊字符
最近进行的MVC系统需要用到记录操作日志和过滤特殊字符的功能,如果每个action中都调用记录日志的方法就太麻烦了,所以根据需要结合mvc的过滤机制 写了个特殊字符验证与记录操作日志的公用类: pub ...
- Tomcat会话超时时怎样记录操作日志,满足安全审计要求
众所周知.在实际的Web应用程序中,会话管理一般都採用Web容器会话管理功能. 使用Tomcat做Webserver也是如此,并且从安全的角度考虑,尽量避免去更改和干预Web容器的会话管理功能. To ...
- 使用SpringBoot AOP 记录操作日志、异常日志
平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...
- Spring aop 记录操作日志 Aspect
前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了 ...
- springboot springmvc拦截器 拦截POST、PUT、DELETE请求参数和响应数据,并记录操作日志
1.操作日志实体类 @Document(collection = "operation_log") @Getter @Setter @ToString public class O ...
- .Net捕获网站异常信息记录操作日志
第一步:在Global.asax文件下的Application_Error()中写入操作日志 /// <summary> /// 整个网站出现异常信息,都会执行此方法 /// </s ...
- 自定义日志注解 + AOP实现记录操作日志
需求:系统中经常需要记录员工的操作日志和用户的活动日志,简单的做法在每个需要的方法中进行日志保存操作, 但这样对业务代码入侵性太大,下面就结合AOP和自定义日志注解实现更方便的日志记录 首先看 ...
- spring-boot-route(十七)使用aop记录操作日志
在上一章内容中--使用logback管理日志,我们详细讲述了如何将日志生成文件进行存储.但是在实际开发中,使用文件存储日志用来快速查询问题并不是最方便的,一个优秀系统除了日志文件还需要将操作日志进行持 ...
随机推荐
- 论文翻译:2020_Densely connected neural network with dilated convolutions for real-time speech enhancement in the time domain
提出了模型和损失函数 论文名称:扩展卷积密集连接神经网络用于时域实时语音增强 论文代码:https://github.com/ashutosh620/DDAEC 引用:Pandey A, Wang D ...
- html+css第二篇
<img src="图片地址" alt="图片名"/> 图片(单标签)alt属性 是图片名字,是给百度搜索引擎抓取使用: a标签: 链接/下载/锚点 ...
- Linux——基础命令用法(上)
一.Linux基础命令 1.Linux命令行的格式 命令行的格式为:用户名+主机名+当前工作目录 输入内容的命令格式为:命令 [-短选项/--长选项] [参数] [root@localhost ~]# ...
- Codeforces 516E - Drazil and His Happy Friends(同余最短路)
Codeforces 题面传送门 & 洛谷题面传送门 首先思考一个非常简单的性质:记 \(d=\gcd(n,m)\),那么每次在一起吃完饭的男女孩编号必定与 \(d\) 同余,而根据斐蜀定理可 ...
- intent.getSerializableExtra(转)
Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...
- R语言与医学统计图形-【10】ggplot2图形映射
ggplot2绘图系统--图形映射 颜色的映射. #aes中映射变量 ggplot()+geom_point(aes(x=carat,y=price,color='blue'),#color视为单一变 ...
- MAC——解决问题:打不开,因为它来自身份不明的开发者
今天在mac电脑上,下载了一个软件,是从某个网页上下载的,点击却不能打开,弹出窗口提示说"打不开xx,因为它来自身份不明的开发者",怎么解决?下面来看下. 方法/步骤 点击 ...
- fastboot烧写Andriod 以及SD 卡烧写LinuxQT,
EMMC是一种FLASH,SD(TF)卡是另外的一种存储,通过控制拨码开关指引CPU去读EMMC还是SD卡的u-boot文件. u-boot的作用 初始化内存控制区,访问存储器,把内核从存储器读取出来 ...
- Google服务器架构图解简析
无疑是互联网时代最闪亮的明星.截止到今天为止,Google美国主站在Alexa排名已经连续3年第一,Alexa Top100中,各国的Google分站竟然霸占了超过20多个名额,不得不令人感叹Goog ...
- Scrapy爬虫框架的安装和使用
Scrapy是一个十分强大的爬虫框架,依赖的库比较多,至少需要依赖的库有Twisted 14.0.lxml 3.4和pyOpenSSL 0.14.在不同的平台环境下,它所依赖的库也各不相同,所以在安装 ...