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

在基于数据库的应用中,数据库的写和更新操作是最消耗系统资源的动作之一,因此对应用中和数据库记录保存相关操作的跟踪分析和统计,在很多场景下非常有意义,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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值