J'essaie d'implémenter un middleware en django (1.4) pour créer un graphique d'appel en utilisant PyCallGraph. Je l'ai basé à partir de deux extraits différents trouvés en ligne. Voici ce qu'il ressemble à:middleware PyCallGraph en django
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
Je l'ai ajouté aux autres intergiciels installés sur settings.py
puis démarré le serveur.
Il semble déclencher lorsque le process_view
est appelé, mais quand il arrive à process_response
django se plaint, en me disant que 'CallgraphMiddleware' object has no attribute 'pycallgraph'
. Comment est-ce possible? Apparemment, la ligne
self.pycallgraph = pycallgraph
n'est pas prise en compte. Pourquoi?
Il existe des situations où 'process_response()' est appelé, mais 'process_view()' n'est pas, par exemple. lorsque le middleware de requête, ou afficher middleware qui est exécuté avant votre propre middleware, renvoie un 'HttpResonse' valide. Pouvez-vous vérifier si 'process_view()' est réellement exécuté? – knbk
@knbk oui c'est. J'ai aussi vérifié si l'instance de 'CallgraphMiddleware' est la même en appelant' process_view' et 'process_response' et oui c'est le cas! Donc, aucune idée .. – Leonardo