您的位置:首页 > 数据库

如何在Django WEB应用内跟踪数据库的save操作

2018-03-13 08:49 246 查看
在基于数据库的应用中,数据库的写和更新操作是最消耗系统资源的动作之一,因此对应用中和数据库记录保存相关操作的跟踪分析和统计,在很多场景下非常有意义,Django提供很好的Hook能力,在ORM操作中发生save等动作的时候,会主动调用应用设置的回调函数,示例代码如下:from django.db.models.signals import post_save
import inspect

def on_db_write(sender, instance, created, **kwargs):
f = sys._getframe()

stacks = inspect.stack()
# 循环到第一个不是Django的代码,显示代码
# 按照目前的架构,在这个函数里的局部变量里,大多数情况下是有request对象的
# 可以从中取出URL信息
for index_scan in range(1 , len(stacks)):
stack = stacks[index_scan]

if 'django' not in stack[1]:
print u'执行代码:%s[%s]%s' % (stack[1] , stack[2] , stack[4])
print u'执行对象:%s(%s)' % (sender.__name__ , sender._meta.db_table)
if 'request' in stack[0].f_locals:
print u'执行URL:' , get_current_url(stack[0].f_locals['request'] , True)
break

if created:
pass

post_save.connect(on_db_write)

def get_current_url(request , full_domain = False , quote_path = False , quote_query = False):
"""取得当前Request请求的URL,full_domain控制是否获取完整的全路径
. 在一些需要登录跳转的地方经常会被用到
"""
url_cur = urllib2.quote(request.META['PATH_INFO'].encode('utf8')) if quote_path else request.META['PATH_INFO']

query = ('?' + request.META['QUERY_STRING']) if request.META.get('QUERY_STRING' , None) else ''
url_cur += urllib2.quote(query) if quote_query else query

return (request.META['wsgi.url_scheme'] + '://' + request.META['HTTP_HOST']) + url_cur if full_domain else url_cur
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: