2011-06-19 38 views
6

Tôi muốn kiểm tra thời gian thực hiện các lượt xem trong trang web của mình. Điều này có thể được thực hiện bởi các trang trí, nhưng vì tôi có hàng chục lượt xem, tôi đã nghĩ đến việc thực hiện nó trong một phần mềm trung gian, tiết kiệm thời gian đầu tiên trong từ điển với yêu cầu như một khóa (xem bên dưới), nhưng tôi lo lắng về các giả định mà tôi đã tạo (xem xa hơn dưới đây):Đo thời gian thực hiện xem trong phần mềm trung gian Django - ý tưởng hay?

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] 

mã này giả định hai điểm:

  1. cùng dụ middleware xử lý trước khi xem và post-view logic.
  2. Phiên bản yêu cầu vẫn giữ nguyên dạng xem trước và sau khi xem.

các giả định này có an toàn không? là phần mềm trung gian này có phải là một ý tưởng hay không?

Trả lời

5

Reading Is Django middleware thread safe? đã cho tôi một ý tưởng tốt hơn:
Để thêm một thuộc tính cho các đối tượng yêu cầu (ví dụ request.start_time = time.time() trước quan điểm được thực hiện).

Điều này tránh giả định 1 và loại bỏ nguy cơ nguy hiểm để thu thập các mục 'zombie' trong từ điển sẽ không bao giờ bị xóa.

Điều này cũng làm giảm giả thiết 2, bởi vì nếu một bản sao yêu cầu mới được thực hiện tại một số điểm thì nó vẫn hoạt động nếu các thuộc tính được sao chép (như đã hoàn thành trong mô-đun sao chép python).

Và thậm chí như một phần thưởng ít mã của nó, ít lỗi hơn và dễ đọc hơn :)

1

Sử dụng này chỉ đơn giản là xem để tính toán thời gian thực hiện, nó hoạt động cũng cho rằng quan điểm nhu cầu người dùng đăng nhập, nó sẽ hiển thị thời gian thực hiện trong một trang đơn giản

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

đối với các bạn trường hợp, sử dụng một vòng lặp cho tất cả các trang của bạn hy vọng nó sẽ giúp một ai đó

Các vấn đề liên quan