Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

TrackBack実装

まーすんげーてきとーに書いてみた。
まあ参考程度に。

TrackBack受信側

まずは受信

モデル

元々の記事をPostクラスとする。
models.py

from django.db import models

class Post(models.Model):
    date = models.DateField();
    title = models.CharField(maxlength=200)
    pub_date = models.DateTimeField('date published', auto_now_add=True)
    body = models.TextField()
    
    class META:
        ordering = ('-pub_date',)
        get_latest_by = 'pub_date'

    
class TrackBack(models.Model):
    post = models.ForeignKey(Post)
    blog_name = models.CharField(maxlength=200)
    title  = models.CharField(maxlength=200)
    url  = models.URLField(blank=True)
    excerpt  = models.TextField()
    pub_date = models.DateTimeField('date published', auto_now_add=True)
    
    class META:
        ordering = ('-pub_date',)
        get_latest_by = 'pub_date'

    class Admin:
        list_display = ('post','blog_name','title',)     

TrackBackの仕様通りにフィールドを作ります。
PostありきなのでTrackBackのForeignKeyにPostを指定します。
あとお好みでvalidatorを使ってください。
ちなみにDjangoのmodel.URLFieldはデフォルトでURLが実在するかチェックしに行きますのでトラバスパム対策のひとつになります。
(逆にチェックしに行くのに時間がかかる場合があります)

URLConf

次にTrackBackを受けるURLを設定します。
url.py

from django.conf.urls.defaults import *
from blog.blogapp.models import *

urlpatterns = patterns('',
・・・
    (r'^/?tb/(?P<post_id>\w*)/$',  'xxx.xxxxx.views.trackback'), 
・・・
)

"/xxx/tb/1223"でTrackBackを受けます。

View

で実際受ける処理は以下。
view.py

def trackback(request, post_id):
    model = TrackBack
    manipulator = model.AddManipulator()
    p = Post.objects.filter(pk=post_id).count()
    if p:
        if request.POST:
            new_data = request.POST.copy()
            new_data['post'] = post_id
            errors = manipulator.get_validation_errors(new_data)
            manipulator.do_html2python(new_data)
            if not errors:
                new_object = manipulator.save(new_data)
                pingMessage = """<?xml encoding="utf-8"?>
                    <response>
                      <error>0</error>
                      <message></message>
                </response>"""
                return HttpResponse(pingMessage)

    pingMessage = """<?xml encoding="utf-8"?>
            <response>
              <error>1</error>
              <message>Error</message>
            </response>"""
    return HttpResponse(pingMessage)

メッセージは適当ですが・・・・。
やってる処理は

  1. URLからPostのidを受けます。
  2. Postのpkでレコードを引き0件かチェック。
  3. 問題なければAddManipulator経由でTrackBackのモデルを作ってsaveします。
  4. 最後にレスポンスを返します。

という感じです。

TrackBack送信側

TrackBackを打つ方ですが

tblib.pyを使うのが楽

です。
http://postneo.com/projects/tblib/からダウンロードして下さい。

更にスパム対策するにはスパムフィルタ用のデコレータを書いてしまう方がよいでしょう。
既存に手を加えなくて済みます。
うーん、結構楽チンにできるもんだ。

追記
viewのtrackbackのメソッドでDBにアクセスするタイミングがよろしくないので勝手に書き換えて下さい。
うくく。