2015-04-21 1 views
1

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?

+1

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

+0

@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

Répondre

1

J'ai oublié d'importer GlobbingFilter donc j'eu une exception qui ne laisserait pas le code à exécuter la ligne self.pycallgraph = pycallgraph

également PyCharm n'a pas été correctement configuré. J'ai résolu grâce à cela Réponse:
https://stackoverflow.com/a/20335280/1191416