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

2008.03.24 Mon l Python Django l COM(0) TB(0) l top ▲
まえに Python - Djangoの開発環境が15分以内に作れちゃうよ!っていう記事を書いたけど、そんなことをしなくても、Ubuntu Linux だったら、

sudo apt-get install python-django

でインストールできます。Djangoに興味があるひとは、とりあえず試してみては?

Package: python-django (0.96-1)より。
2007.08.12 Sun l Python Django l COM(1) TB(0) l top ▲
DjangoでLivedoorAuthを使う方法。こんな感じかなぁ。

お好み焼きともんじゃ焼きの食べ比べをして「どっちも結局はビールのつまみなんだから、野菜炒めで十分」という結論を出して、終電で帰ってきた。
LivedoorAuthを使うために、なんとなくviewを定義してみた。


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")


Sessionの管理とか、認証のURLのタイムアウトとか、いろいろやらなくちゃいけないことは残ってるけれど、とりあえず今夜はもう寝たい。
もっと簡単なやり方がありそうだけどなぁ…。
2007.07.15 Sun l Python Django l COM(0) TB(0) l top ▲
さくらインターネットで、DjangoをCGIとして動かす方法が、ようやくわかった。まる1日かかってようやく解決した。
参考にさせてもらったサイトをまとめ。私も、上の3つのリンク先ブログの中の人と同じ所ではまっていました…。
http://php-sql-gdgd.jugem.jp/?eid=22
http://php-sql-gdgd.jugem.jp/?eid=23
http://php-sql-gdgd.jugem.jp/?eid=24
http://www.panopticon.jp/blog/2007/04/011732.html
http://sh1.2-d.jp/b/2006-09-10-01-39.html
http://blog.joyfullife.jp/archives/2007/04/16134657.php
http://code.djangoproject.com/ticket/2407

それにしても、今さらだけど、週末が終わっちゃったなぁ。
2007.07.10 Tue l Python Django l COM(2) TB(0) l top ▲
Djangoをさくらインターネットのサーバで、CGIとして動かそうと試みているのだけれど、今日は失敗。
エラーのログが見れないのが辛いな〜。とりあえず自前のサーバに移してやってみるか。

とりあえず、参考にしているサイトのリスト
http://php-sql-gdgd.jugem.jp/?eid=23
http://www.panopticon.jp/blog/2007/04/011732.html
http://sh1.2-d.jp/b/2006-09-10-01-39.html
http://blog.joyfullife.jp/archives/2007/04/16134657.php

python manage.py runserver
でやるとちゃんと動くんだけどなぁ…。
2007.07.09 Mon l Python Django l COM(0) TB(1) l top ▲