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')
¿El tipo de contenido respondo con importancia? – MattoTodd
Sí, probablemente debas convertirlo en imagen/png. –
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). –