如何在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
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
相关文章推荐
- pythonWeb -- Django开发- 模型Model 和 数据库的操作
- 数据库异库操作(SQL2000)_数据库开发_web应用开发
- 如何简化数据库的访问与操作,兼谈泛型的应用
- Django数据库操作之save与update
- Django初级手册1-项目和应用的创建与简单的数据库操作
- 如何在django中使用models.py对数据库进行操作
- sqlite3常用命令以及django如何操作sqlite3数据库
- python django 增删改查操作 数据库Mysql
- C#如何写DBHelper 类(数据库连接和操作)
- Java Web----Java Web的数据库操作(二)
- 如何优化操作大数据量数据库(建立索引)
- Android如何利用JS来操作WebView里面的内容
- Django 是如何实现用户登录和登出机制的(默认版本-数据库版本)
- Java - 使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
- 如何实现web应用下载文件时不弹出文件保存对话框,而是直接保存到指定的文件中
- JavaWeb体系结构的理解-7.数据库应用
- 如何在web Servlet中应用JFreeChart
- Django修改model如何同步数据库
- Delphi 调用JAVA WebService 操作数据库登录的例子
- django arya插件对数据库操作使用,reverse发娘解析url的使用