我想优化我的 django 应用程序,为此,我使用 django_debug_toolbar 来了解为计算 html 页面所做的 SQL 请求。我想对打开的文件做同样的事情:是否有 django_debug_toolbar 插件或者有没有办法开发一个 django 中间件来在 html 页面请求期间跟踪打开的文件?
问问题
202 次
1 回答
0
最后我给自己写了一个 django 中间件:
import __builtin__
def newFileClassFactory(oldfile,openfiles):
class newfile(oldfile):
def __init__(self, *args):
self.thepath = args[0]
print "### OPENING %s ###" % str(self.thepath)
try:
oldfile.__init__(self, *args)
except Exception,e:
print e
raise
openfiles.add(self.thepath)
def close(self):
print "### CLOSING %s ###" % str(self.thepath)
oldfile.close(self)
openfiles.remove(self.thepath)
return newfile
class OpenedFiles(object):
def __init__(self):
self.oldfile = __builtin__.file
self.openfiles = set()
self.newfile = newFileClassFactory(self.oldfile,self.openfiles)
self.oldopen = __builtin__.open
def newopen(*args):
return self.newfile(*args)
self.newopen = newopen
def process_response(self, request, response):
if request.path.split('.')[-1].lower() not in ('ico','jpg','jpeg','gif','png','js','css'):
if self.openfiles:
print 'Not closed files :'
print '----------------'
print '/n'.join(self.openfiles)
print '*' * 60,' End of Request (%s)' % request.path
__builtin__.file = self.oldfile
__builtin__.open = self.oldopen
return response
def process_request(self, request):
if request.path.split('.')[-1].lower() not in ('ico','jpg','jpeg','gif','png','js','css'):
__builtin__.file = self.newfile
__builtin__.open = self.newopen
print '*' * 60,' Beginning of Request (%s)' % request.path
return None
只需在 MIDDLEWARE_CLASSES 的 settings.py 中添加 'your.module.path.OpenedFiles' (如果您想捕获 django 在其中间件中所做的事情,则在第一行),所有打开的文件都将在运行 django 内置时打印在控制台上服务器(python manage.py runserver)它还将打印发生的错误和未关闭的文件。
有趣的是,许多本地文件被 django 或应用程序打开以生成动态页面(模板、会话文件、缓存信息、图像以生成动态缩略图......)
于 2012-08-27T16:53:02.517 回答