Измерение времени выполнения представления в промежуточном программном обеспечении Django - хорошая идея? - PullRequest
7 голосов
/ 19 июня 2011

Я хочу проверить время выполнения просмотров на моем сайте.Это может быть сделано декораторами, но, поскольку у меня есть десятки представлений, я подумал сделать это в промежуточном программном обеспечении, сохранив начальное время в словаре с запросом в качестве ключа (см. Ниже), но я беспокоюсь о сделанных мною предположениях(см. ниже):

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]

этот код предполагает две точки:

  1. Один и тот же экземпляр промежуточного программного обеспечения обрабатывает логику предварительного просмотра и последующего просмотра.
  2. Экземпляр запроса остается прежним до и после просмотра.

безопасны ли эти предположения?это промежуточное ПО - хорошая идея?

Ответы [ 2 ]

6 голосов
/ 20 июня 2011

Чтение Безопасен ли поток промежуточного программного обеспечения Django? дал мне лучшую идею:
Чтобы добавить атрибут к объекту запроса (т. Е. request.start_time = time.time() до выполнения представления).

Это исключает предположение 1 и устраняет потенциальную возможность собирать в словаре «зомби» предметы, которые никогда не будут очищены.

Это также несколько уменьшает предположение 2, потому что, если в какой-то момент будет сделана новая копия запроса, он все равно будет работать, если скопированы атрибуты (как это сделано в модуле копирования Python).

И даже в качестве бонуса его меньше кода, меньше подвержен ошибкам и более читабельным:)

1 голос
/ 19 сентября 2014

Используйте это простое представление для расчета времени выполнения, оно работает также для представлений, которые нужен логин пользователя, он отображает время выполнения на простой странице

 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})

Для вашего случая, используя цикл для всех ваших страниц надеюсь, это кому-нибудь поможет

...