【发布时间】:2015-04-21 23:41:50
【问题描述】:
我正在尝试在 django(1.4) 中实现一个中间件,以使用PyCallGraph 创建一个调用图。 我基于在网上找到的两个不同的 sn-ps。这是它的样子:
import time
from django.conf import settings
from pycallgraph import Config
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
class CallgraphMiddleware(object):
def process_view(self, request, callback, callback_args, callback_kwargs):
if settings.DEBUG and 'graph' in request.GET:
config = Config()
config.trace_filter = GlobbingFilter(exclude=['pycallgraph.*','*.secret_function',], include=['reports.*'])
graphviz = GraphvizOutput(output_file='callgraph-' + str(time.time()) + '.png')
pycallgraph = PyCallGraph(output=graphviz, config=config)
pycallgraph.start()
self.pycallgraph = pycallgraph
def process_response(self, request, response):
if settings.DEBUG and 'graph' in request.GET:
self.pycallgraph.done()
return response
我已将其添加到安装在settings.py 上的其他中间件中,然后启动了服务器。
它似乎在调用process_view 时触发,但当它到达process_response 时,django 会抱怨,告诉我'CallgraphMiddleware' object has no attribute 'pycallgraph'。这怎么可能?显然这条线
self.pycallgraph = pycallgraph
不予考虑。为什么?
【问题讨论】:
-
在某些情况下会调用
process_response(),但不会调用process_view(),例如当请求中间件或查看在您自己的中间件之前执行的中间件时,返回有效的HttpResonse。你能检查一下process_view()是否真的在运行吗? -
@knbk 是的。我还仔细检查了
CallgraphMiddleware的实例在调用process_view和process_response时是否相同,是的!所以,不知道..
标签: python django debugging call-graph pycallgraph