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)
メッセージは適当ですが・・・・。
やってる処理は
- URLからPostのidを受けます。
- Postのpkでレコードを引き0件かチェック。
- 問題なければAddManipulator経由でTrackBackのモデルを作ってsaveします。
- 最後にレスポンスを返します。
という感じです。
TrackBack送信側
TrackBackを打つ方ですが
tblib.pyを使うのが楽
です。
http://postneo.com/projects/tblib/からダウンロードして下さい。
更にスパム対策するにはスパムフィルタ用のデコレータを書いてしまう方がよいでしょう。
既存に手を加えなくて済みます。
うーん、結構楽チンにできるもんだ。
追記:
viewのtrackbackのメソッドでDBにアクセスするタイミングがよろしくないので勝手に書き換えて下さい。
うくく。