2011-08-18 12 views
7

estoy usando Django para hacer un seguimiento de píxel en un correo electrónicoDjango seguimiento de píxeles

Es fácil devolver una imagen real de una vista de Django (y cómo podría hacerse esto?) O es más fácil simplemente ¿Devolver un redireccionamiento a la url donde vive la imagen real?

Respuesta

6

No necesita una imagen real para un rastreador de píxeles. De hecho, es mejor si no tienes uno.

Simplemente use la vista como fuente para la etiqueta de la imagen, y haga que devuelva una respuesta en blanco.

+0

¿El tipo de contenido respondo con importancia? – MattoTodd

+0

Sí, probablemente debas convertirlo en imagen/png. –

+5

Para el registro, me he dado cuenta de que enviar una respuesta en blanco puede ser problemático, al menos en gmail en Chrome, que da como resultado un glifo de imagen roto que aparece en el mensaje. Es mejor transmitir una imagen trivial, [como lo sugirió Russell Keith-Magee] (https://groups.google.com/forum/#!topic/django-users/-xiaSqXdWvc). –

2

Django tiene un auxiliar static file que se puede usar para mostrar la imagen, pero no se recomienda debido al rendimiento. Creo que tener una vista que hace la contabilidad para rastrear el píxel, luego redirigir a una url que serves the actual image via the webserver va a darle el mejor rendimiento.

3

Dado que este fue el primer resultado en mi búsqueda en Google y la mejor respuesta está enterrada en el enlace de Daniel (pero no se menciona como la mejor), pensé que simplemente publicaría la respuesta para que nadie tenga la tentación de devolverle un respuesta que, como señala Michael, no es ideal.

La solución es utilizar una vista estándar y devolver una HttpResponse con los datos brutos que conforman un solo píxel GIF. No tener que golpear el disco o redirigir es una gran ventaja.

Tenga en cuenta que el patrón de URL utiliza el código de seguimiento como el nombre de la imagen, por lo que no hay ningún código obvio? Jod = jf8992jf en la 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'), 
) 

Y aquí está la vista. Tenga en cuenta que utiliza cache_control para evitar que las solicitudes se ejecuten de forma salvaje. Firefox (junto con muchos clientes de correo electrónico), por ejemplo, solicitará la imagen dos veces todas las veces por alguna razón que probablemente no le importe, pero de la que tenga que preocuparse. Al agregar max_age = 60, obtendrá una solicitud por 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 señalar que en Python3 'pixel_image' debe ser [prefijo] (https://docs.python.org/3/library/stdtypes.html#bytes) con' b', para que sea de tipo 'bytes' y no 'str'. De lo contrario, la respuesta no será una imagen real y aún resultará en el glifo de la imagen rota que Michael menciona. – alxs

+0

Gracias por la actualización @alxs - He actualizado el código de muestra para incluir 'b'. – dotcomly

Cuestiones relacionadas