2011-08-18 4 views
7

sto usando Django per fare un tracker pixel su una e-maildjango pixel di monitoraggio

E 'facile restituire un immagine reale da una vista Django (e come sarebbe questo essere fatto?) O è più facile da solo restituire un reindirizzamento all'URL in cui vive l'immagine reale?

risposta

6

Non è necessaria un'immagine reale per un pixel tracker. In effetti, è meglio se non ne hai uno.

Basta usare la vista come sorgente per il tag immagine e restituire una risposta vuota.

+0

il tipo di contenuto I risponde con la domanda? – MattoTodd

+0

Sì, dovresti probabilmente renderlo immagine/png. –

+5

Per la cronaca, ho notato che l'invio di una risposta vuota può essere problematico - almeno in gmail su Chrome, che risulta nel glifo di un'immagine spezzata che appare nel messaggio. È meglio trasmettere in streaming un'immagine banale [come suggerito da Russell Keith-Magee] (https://groups.google.com/forum/#!topic/django-users/-xiaSqXdWvc). –

2

Django ha un helper static file che può essere utilizzato per servire l'immagine, ma non è consigliato a causa delle prestazioni. Credo che avere una visione che fa la contabilità per tracciare il pixel, quindi reindirizzare a un URL che serves the actual image via the webserver sta per darvi la migliore prestazione.

3

Poiché questo è stato il primo risultato sulla mia ricerca su google e la risposta migliore è sepolta nel link da Daniel (ma non menzionata come la migliore), ho pensato di pubblicare la risposta in modo che nessuno fosse tentato di restituire un vuoto risposta che, come sottolinea Michael, non è l'ideale.

La soluzione consiste nell'utilizzare una visualizzazione standard e restituire una HttpResponse con i dati non elaborati che costituiscono un singolo pixel gif. Non dover colpire il disco o il reindirizzamento è un enorme vantaggio.

Si noti che il modello di URL utilizza il codice di monitoraggio come nome dell'immagine, quindi non vi è alcun evidente? Code = jf8992jf nell'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'), 
) 

Ed ecco il punto di vista. Si noti che utilizza cache_control per impedire che le richieste vengano eseguite in modo selvaggio. Ad esempio, Firefox (insieme a molti client di posta elettronica) richiederà l'immagine due volte ogni volta per qualche motivo che probabilmente non ti interessa, ma devi preoccuparti. Aggiungendo max_age = 60 otterrai solo una richiesta al minuto.

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

Vale la pena notare che in Python3 'pixel_image' dovrebbe essere [prefissato] (https://docs.python.org/3/library/stdtypes.html#bytes) con' b', in modo che sia di tipo 'bytes' e non 'str'. Altrimenti, la risposta non sarà un'immagine reale e provocherà comunque il glifo dell'immagine spezzata menzionata da Michael. – alxs

+0

Grazie per l'aggiornamento @alxs - Ho aggiornato il codice di esempio per includere 'b'. – dotcomly