www.kokkaitter.com のサイトの裏には、発言をまとめたデータベースがある。アクセスがある度に、そのデータベースを参照してページを生成している。このような手法は頻繁に更新されるサイトを作るとき便利だ。なぜならデータベースを更新すれば、すぐにそれがサイトに反映されるからだ。
ところが、kokkaitter.com は、動的なサイトではない。ページの内容が書き換わるタイミングは、私が議事録からデータをコピペして追加したときだけで、普段はデータベースから読み込んで表示するだけだ。そういう場合、データベースから読み込んで生成したページをあらかじめ作っておいて、アクセスの度にページを生成しないようにすると、より速くページを表示させることができる。
この機能はキャッシュと呼ばれる。 Django では、簡単にキャッシュの機能を利用することができる。
Django にはキャッシュを実装する方法として、memcached を使う方法と、データベースを使う方法と、ファイルシステムを使う方法と、ローカルメモリを使う方法の 3 通りの方法がある。さくらで Django を CGI として動かしている場合、使えるのはデータベースを使う方法と、ファイルシステムを使う方法の 2 つだけだ。このうち、データベースを使う方法を、今回試してみた。Django のキャッシュフレームワークの通りにやったら、簡単にできた。
まず、
python manage.py createcachetable [cache_table_name]
して、キャッシュ用のデータベーステーブルを作る。[cache_table_name]は、他のテーブルと名前がかぶらなければ何でもいい。で、 setting.py
CACHE_BACKEND = 'db://さっき作ったテーブルの名前'
と書く。
次に、今回はビュー単位でキャッシュすることにしたので、view.py で from django.views.decorators.cache import cache_page して、キャッシュを使う関数の前に、 @cache_page(キャッシュの時間(秒)) を書くだけ。たとえばキャッシュのタイムアウトを 1 日に設定するときは、 @cache_page(60*60*24)
これだけ。簡単過ぎる。 DjangoかわいいよDjango
from django.http import HttpResponseRedirect, HttpResponse
import time, sha, urllib, hmac
def jump(request):
query = { 'app_key': "...application_key...",
'perms': 'userhash',
't': str( int(time.time())),
'v': '1.0',
'userdata': request.POST.get('url','http://www.sample.net/')
}
sec_key = "...secret_key..."
sig = hmac.new(sec_key, digestmod=sha)
keys = query.keys()
keys.sort()
for key in keys:
sig.update(key)
sig.update(query[key])
query['sig'] = sig.hexdigest()
return HttpResponseRedirect('http://auth.livedoor.com/login/?%s'%urllib.urlencode(query))
def callback(request):
query = request.GET
sec_key = "...secret_key..."
sig = hmac.new(sec_key, digestmod=sha)
keys = query.keys()
keys.sort()
for key in keys:
if key == "sig":
continue
sig.update(key)
sig.update(query[key])
if sig.hexdigest() == request.GET.get("sig",""):
return HttpResponseRedirect(urllib.unquote(query.get("userdata","http://www.sample.net")))
else:
return HttpResponse("NG")