2012-11-11 16 views
7

Oldukça geniş bir çerçeve olan ve oldukça geniş bir uygulama, orta sınıf, bağlamsal işlemci vb. Kullanıyorum. Ölçek, kod tabanının bir kısmının, istemediğim istekleri çalıştırdığı ve bunun neden zor olduğunu belirlediği anlamına gelir. Düz kod denetimi, bir hata ayıklayıcıdaki tüm istekte tek adımda olduğu gibi, çok fazla zaman alıcıdır.Büyük bir Python kod tabanında neden bir etkiden izlenme

Bu özel durumda, benim sorunum, yoğun önbelleğe almak istediğim ve herhangi bir kurabiye ihtiyacım olmaması gerekenler de dahil olmak üzere her yanıtta "Vary: Cookie" ayarlıyorum. Şüpheliyim, ama nasıl kanıtlayacağımı bilemiyorum, bazı ara katman yazılımları veya içerik işlemcisi, sonucu kullanmasa bile request.session'a erişiyor - dolaylı erişim olabilir, örneğin request.user. Ve elbette, tamamen başka bir şey olabilir.

Python'da, büyük bir kod tabanında nedenine bir etkiden ("Vary üstbilgisi yanıta eklenir") nasıl bir iz bırakırsınız?

+1

Hello. Ben django ile aşina değilim, ama ne yaptığını bulmanız gerekiyorsa 'A [' x '] = y' ve 'A' yerleşik bir nesne değil, o zaman sadece A .__ setitem__ yerine kendi "__setitem__" komutunu çalıştırdıktan sonra "Vary: Cookie" başlığının görünüp görünmediğini kontrol edin ve eğer öyleyse, sadece size neden olan şeyi yönlendirecek olan çağrı yığınını yazdırın. Başka bir değişken ise, program satırınızı her zaman çalıştıracak ve ihtiyacınız olan başlık belirli bir nesneye eklenmişse, her seferinde kontrol edecek bir hata ayıklayıcısını yazmaktır. –

+0

Teşekkürler, @alex_jordan, bu iyi bir başlangıç. Çağrı yığınını programatik olarak nasıl yazdırırsınız? Ve bu durumda, bir bayrak başka bir yere ayarlanmışsa, başlığın ekleneceğine inanıyorum, bu yüzden çağrı yığını, hangi bayrakların tetiklendiğini söyleyecektir; ancak bayrak ayarlandığında ne zaman alan görevlerini izleyebilirim? Son olarak, söz konusu nesneler istek başına tahsis edilir. Tüm örnekler için bunu yapmak için geldikleri sınıfı maymun-yama yapabilir miyim? –

+0

Jamey, aşağıda verdiğim çözüm, yalnızca django hata raporlamasını kullanıyor ve yığın takibini kendiniz yazdırmanın ayrıntıları hakkında endişelenmenize gerek kalmıyor. – BenTrofatter

cevap

3

İşte bir düşünce: maymun, __setitem__ yönteminin Vary olarak ayarlanmış olması durumunda bir istisna oluşturması için django HttpResponse sınıfını yamaları. Bunu, oluşturulduğunda, aksi takdirde yapılmayan bir ara yazılımdan halledebilirsiniz. Üstbilgiyi ayarlayan satırdan güzel bir geri izleme yapmalı.

class MonkeyPatchMiddleware(object): 

    def __init__(self): 
     from django.http import HttpResponse 

     original_set_item = HttpResponse.__setitem__ 

     def __setitem__(self, header, value): 
      if header == "Vary": 
       raise ValueError 
      original_set_item(self, header, value) 

     HttpResponse.__setitem__ = __setitem__ 

sizin django ayarları dosyasında ortakatmanı ilk iş olarak orta katman yükleyin.

+0

Teşekkürler! Uygulamamın, bir ara katman eklemek yerine, 'views.py' içinde denemek için daha uygun buldum. Traceback, 'patch_vary_headers' diye çağıran' SessionMiddleware.process_response 'olduğunu söyledi, ancak nedenini bulmak için,' request.session.accessed 'ayarını neyin olduğunu bulmam gerekti. "SessionBase.accessed = property (lambda self: False, raise_on_true)" 'da maymun-yama, bana gerçek kök nedeniyle bir iz bıraktı. –

İlgili konular