2011-08-18 29 views
7

Używam Django zrobić tracker pikseli na e-mailDjango pikseli śledzenia

Czy łatwo powrócić rzeczywisty obraz z widokiem django (i jak to zrobić?), Czy jest to po prostu łatwiej zwrócić przekierowanie do adresu URL, gdzie znajduje się rzeczywisty obraz?

Odpowiedz

6

Nie potrzebujesz rzeczywistego obrazu dla piksela śledzącego. Właściwie lepiej, jeśli go nie masz.

Po prostu użyj widoku jako źródła tagu obrazu i poproś go o pustą odpowiedź.

+0

Czy typ zawartości odpowiada z materią? – MattoTodd

+0

Tak, prawdopodobnie powinieneś zrobić obraz/png. –

+5

Zauważyłem, że wysłanie pustej odpowiedzi może być problematyczne - przynajmniej w Gmailu w Chrome, co powoduje pojawienie się uszkodzonego obrazka w wiadomości. Lepiej jest przesyłać banalne obrazy, jak sugeruje Russell Keith-Magee (https://groups.google.com/forum/#!topic/django-users/-xiaSqXdWvc). –

2

Django ma pomocnika static file, który może służyć do wyświetlania obrazu, ale nie jest zalecany z powodu wydajności. Wierzę, że posiadanie widoku, który prowadzi księgę do śledzenia piksela, a następnie przekierowanie do adresu URL, który zapewni najlepszą wydajność.

3

Ponieważ był to pierwszy wynik w mojej wyszukiwarce Google, a najlepsza odpowiedź jest ukryta w łączu Daniela (ale nie wspomniano o tym jako najlepsza), pomyślałem, że po prostu podałbym odpowiedź, aby nikt nie miał ochoty zwracać pustego Odpowiedź, którą Michael wskazuje, nie jest idealna.

Rozwiązaniem jest użycie standardowego widoku i zwrócenie HttpResponse z surowymi danymi, które składają się na pojedynczy piksel. Brak konieczności uderzania dysku lub przekierowania to ogromna zaleta.

Należy pamiętać, że wzorzec adresu URL używa kodu śledzenia jako nazwy obrazu, więc nie ma oczywistego kodu? Code = jf8992jf w adresie URL.

from django.conf.urls import patterns, url 
from emails.views.pixel import PixelView 

urlpatterns = patterns('', 
    url(r'^/p/(?P<pixel>\w+).gif$', PixelView.as_view(), name='email_pixel'), 
) 

A oto widok. Zwróć uwagę, że używa on opcji cache_control, aby zapobiec uruchamianiu żądań. Firefox (wraz z wieloma klientami poczty e-mail) na przykład poprosi o dwa razy obraz z jakiegoś powodu, którego prawdopodobnie nie obchodzi, ale musi się martwić. Przez dodanie max_age = 60 otrzymasz tylko jedno żądanie na minutę.

from django.views.decorators.cache import cache_control 
from django.http.response import HttpResponse 
from django.views.generic import View 

class PixelView(View): 

    @cache_control(must_revalidate=True, max_age=60) 
    def get(self, request, pixel): 
     """ 
     Tracking pixel for opening an email 
     :param request: WSGIRequest 
     :param pixel: str 
     :return: HttpResponse 
     """ 

     # Do whatever tracking you want here 

     # Render the pixel 
     pixel_image = b'\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff\x00\x00\x00\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44\x01\x00\x3b' 
     return HttpResponse(pixel_image, content_type='image/gif') 
+1

Warto zauważyć, że w Python3 'pixel_image' powinno być [prefixed] (https://docs.python.org/3/library/stdtypes.html#bytes) z' b', tak aby było typu 'bytes' a nie "str". W przeciwnym razie odpowiedź nie będzie faktycznym obrazem i nadal będzie skutkować uszkodzeniem glifu obrazu, o którym wspomina Michael. – alxs

+0

Dzięki za aktualizację @alxs - zaktualizowałem przykładowy kod, dodając słowo "b". – dotcomly