2011-06-19 8 views
6

Chcę sprawdzić czas wykonania widoków w mojej witrynie. Może to być zrobione przez dekoratorów, ale ponieważ mam dziesiątki widoków, pomyślałem o zrobieniu tego w oprogramowaniu pośredniczącym, zapisując początkowy czas w słowniku z żądaniem jako kluczem (patrz poniżej), ale martwię się o założenia, które zrobiłem (patrz dalej poniżej):Pomiar czasu wykonywania widoku w oprogramowaniu pośredniczącym Django - dobry pomysł?

class SlowWarningMiddleware: 

    def __init__(self): 
     self.time_tracking = {} 

    def process_view(self, request, view_func, view_args, view_kwargs): 
     self.time_tracking[request] = time.time() 

    def process_response(self, request, response): 
     if request not in self.time_tracking: 
      return response 
     delta = time.time() - self.time_tracking[request] 

    def process_exception(self, request, exception): 
     if request not in self.time_tracking: 
      return 
     delta = time.time() - self.time_tracking[request] 

kod spełnia dwie kwestie:

  1. tego samego wystąpienia pośredniej obsługuje wstępnie widok i po widok logiki.
  2. Instancja żądania pozostaje tym samym widokiem wstępnym i post-view tego samego wystąpienia.

Czy te założenia są bezpieczne? czy to oprogramowanie pośrednie to dobry pomysł?

Odpowiedz

5

Reading Is Django middleware thread safe? dał mi lepszy pomysł:
Aby dodać atrybut do obiektu żądania (tzn request.start_time = time.time() przed pogląd jest wykonywana).

Pozwala to uniknąć założenia 1 i usuwa niebezpieczny potencjał zbierania przedmiotów z zombie w słowniku, które nigdy nie zostaną usunięte.

To również nieco redukuje założenie 2, ponieważ jeśli w którymś momencie zostanie wykonana nowa kopia żądania, nadal będzie działało, jeśli atrybuty zostaną skopiowane (jak zrobiono w module Pythona).

I nawet jako bonus jej mniej kodu, mniej podatną na błędy i bardziej czytelny :)

1

Użyj tego po prostu zobaczyć, aby obliczyć czas wykonania, działa również dla widoków że potrzeby logowania użytkownika, wyświetla czas realizacji w prostej strony

def test(request): 
    from django.test.client import Client 
    import time 

    c = Client() 

    #client login if needed 
    response = c.post('/login/', {'username': 'admin', 'password': 'password'}) 

    start = time.time() 
    response = c.get('/pagetotest/') 

    #print response 
    #print 'Finished, time: ', time.time() - start # output to console 
    end=time.time() - start 
    return render(request,'loadingtime.html',{'time':end}) 

dla ciebie sprawy, za pomocą pętli na wszystkich stronach nadzieję, że pomoże ktoś