2017-09-22 7 views
0

Ces suivent middleware dans mon projet:Pourquoi cela prend-il plus de temps pour accéder à la vue après avoir croisé le middleware dans Django?

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'simple_history.middleware.HistoryRequestMiddleware', 
    'apps.quiz.totaltimemid.TimeCalculateMiddleware', 
    ] 

Mon middleware personnalisé pour mesurer le temps pour atteindre process_view du dernier middleware à mon point de vue cible (classe QuizFetchView (APIView)):

class TimeCalculateMiddleware(object): 

    def process_view(self, request, callback, callback_args, 
     callback_kwargs): 
     self.req_start_time = time.time() 


    def process_response(self,request, response): 
     try : 
      response['vreach_time'] = float(response['tt_start']) - self.req_start_time 
      return response 
     except : 
      return response 

vue cible :

class QuizFetchView(APIView): 
    permission_classes = [IsAuthenticated, IsAuthenticatedForRunningQuiz] 
    def get(self, request: Request, key: str) -> Response: 
     tt_start = time.time() 
     .............. 
     .............. 
     ............ 
     Response['tt_start'] = tt_start 
     return Response 

Pour la demande de connexion middleware à afficher prendre quelques millisecondes, mais demande ultérieure autre que la connexion prendre 25- 35ms pour atteindre la vue.

S'il vous plaît aidez-moi, je vous remercie

+2

Il serait très difficile de savoir pourquoi il est lent sans regarder le code que vous avez supprimé. Il pourrait y avoir un certain nombre de raisons pour lesquelles cela se produit. Premier parmi eux serait une requête mal indexée. – vignesh

+0

Je veux calculer le temps qu'il faut pour atteindre la vue cible –

+0

Ah j'ai mal compris la question. BTW comment êtes-vous capable de ce 'Response ['tt_start'] = tt_start' sans aucune exception. La réponse n'est-elle pas un type? J'essayais de répliquer votre code dans mon côté, mais cela générait une erreur. – vignesh

Répondre

0

NB: Rien de tout cela est en fait une bonne réponse, mais cela était un peu trop long et complexe pour un commentaire.

Premier point: d'exception ne sont pas gratuits lorsqu'une exception est déclenchée, si vous voulez vraiment remplacer votre try/except bloc avec un test de confinement, à savoir:

if "tt_start" in response: 
    response['vreach_time'] = float(response['tt_start']) - self.req_start_time 

return response 

Deuxième point: intergiciels sont instanciés une fois au démarrage du processus et réutilisés pendant toute la durée du processus, vous ne devriez donc pas trop vous fier aux variables d'instances du middleware. Cela pourrait fonctionner plus ou moins sur une configuration "multi-singlethreaded-processes", mais est garanti pour casser un environnement multithread. IOW, vous feriez mieux de stocker start_time sur la demande elle-même.

Troisième point: stocker tt_start sur la réponse est discutable, mais êtes-vous sûr vous voulez en faire un en-tête de réponse?

EDIT: Je devais prendre un café et lire votre extrait une seconde fois avant de dire que vous étiez en train d'enregistrer toute la durée d'exécution de la vue. Donc, par rapport à la question efficace, la réponse est: Je n'ai pas encore la moindre idée, désolé;)

Enfin, si vous voulez identifier les goulots d'étranglement, un profileur approprié pourrait être un meilleur outil.

+0

La vue process_view de mon middleware personnalisé est la dernière process_view exécutée. À ce moment, j'enregistre l'heure et lorsque l'exécution du code de la vue cible démarre, j'enregistre temps et prendre la différence de ces temps, et la différence est d'environ 30 ms, même si je n'utilise pas mon middleware, il prend presque le même temps qu'il prenait plus tôt. –

+0

@VickyGupta en effet, aurait dû lire votre extrait de code une seconde fois, désolé (réponse éditée). –