2011-08-18 4 views
7

はDjangoのビューからの実際の画像を返すように、それは簡単です(とどのようにこれを行うことでしょうか?)、またはそれだけに簡単です実際の画像が存在するURLにリダイレクトを返しますか?Djangoのピクセルトラッキング

答えて

6

トラッカーピクセルには実際の画像は必要ありません。実際、あなたが持っていない方が良いです。

ビューをイメージタグのソースとして使用し、空白の応答を返します。

+0

コンテンツタイプIは問題で応答しますか? – MattoTodd

+0

はい、おそらくイメージ/ pngにする必要があります。 –

+5

記録のために、空白の応答を送信すると問題が起きる可能性があることに気付きました。少なくともChromeのGmailでは、メッセージに壊れた画像の字形が表示されます。 [Russell Keith-Magee(https://groups.google.com/forum/#!topic/django-users/-xiaSqXdWvc)によって提案されているように]些細なイメージをストリーミングする方が良いでしょう。 –

2

Djangoには画像を提供するために使用できるstatic fileヘルパーがありますが、パフォーマンスのために推奨されません。私はピクセルを追跡するために簿記を行うビューを持っていると信じて、serves the actual image via the webserverというURLにリダイレクトすると、最高のパフォーマンスが得られます。

3

これは私のGoogle検索の最初の結果であり、最良の答えはDanielのリンクに埋もれていますが(最高のものとしては言及されていません)、誰も空白を返そう​​としないのでマイケルが指摘しているように、レスポンスは理想的ではない。

解決策は、標準ビューを使用して、単一のピクセルgifを構成する生データとともにHttpResponseを返すことです。ディスクやリダイレクトする必要はありませんが、大きな利点です。

URLパターンにはトラッキングコードがイメージ名として使用されるため、URLには明らかな?code = jf8992jfはありません。

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'), 
) 

次に、この図があります。リクエストがワイルドで実行されないようにするには、cache_controlを使用することに注意してください。たとえばFirefoxは(多くの電子メールクライアントと一緒に)何らかの理由で毎回イメージを2回要求しますが、心配する必要はありませんが、心配する必要はありません。 max_age = 60を追加すると、1分間に1つのリクエストが得られます。

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

Python3の 'pixel_image'は' b'で[prefixed](https://docs.python.org/3/library/stdtypes.html#bytes)にする必要がありますので、 'bytes'型であることに注意してください'str'ではなく。それ以外の場合、レスポンスは実際のイメージではなく、Michaelが言及している壊れたイメージグリフになります。 – alxs

+0

@alxsを更新していただきありがとうございます。私は 'b'をインクルードするようにサンプルコードを更新しました。 – dotcomly

関連する問題