at_yasu's blog

ロード的なことを

メモ書き

今までまじめにdjangoで作ってなかったので、公開した際にアラが出たのでメモ書き。

2時間ほどでさくっと各ブックマークサイトのブックマークトップ一覧*1を表示するサイトを作ったのだけど、公開したらいろいろがたがたとなったので、反省を込めて。

model名

OjbCの癖で変数やクラス名を付ける時、単語の先頭は大文字という事をやらかします。例えば「bookmark site」だと、Perlの場合は「bookmark_site」だけど、ObjCの場合「bookmarkSite」にします。Pythonコード内ではそれで良い?のですが、SQLの場合は大文字小文字が関係ないので、一見うまくいってるようでもクライアント/サーバのライブラリによってはエラーを吐く場合があります。

少なくともうちのところ、クライアントはPostgreSQL8.2.3、サーバはPostgreSQL8.3.5の場合だと、SQLエラーを吐かれてうまくいきませんでした。

500.html

ほとんどDEBUG環境下で作業していたので全く気にしていなかったのですが、template以下に500.htmlが必要なのです。404.htmlも必要かも。

Cache

全く考えたことがありませんでした。申し訳ありませんでした。現在勉強中。おかげで表示が2.3sかかって重たい状態・・・orz

コマンド

ちゃんとmanage.pyで作成するコマンドもあるのですが、わたしゃ面倒で、自分でコマンドを作ってしまいます。そうするとdjangoのプロジェクトフォルダーにPythonPathを通さないと行けないわけで、それではまった。ちなみに、プロジェクトフォルダーでmodelなどをimportするには、settings.pyを通さないといけないです。その、settings.pyを通す方法。*2

from django.core.management import execute_manager, setup_environ
os.chdir(os.getcwd())
sys.path.append(os.getcwd())

import tewi.settings as settings
prjdir = setup_environ(settings)

Apache

こんな感じの設定。

# $Id: tewi.a-yasui.info.conf,v 1.1 2009/01/27 18:52:07 yasui Exp $
# $Date: 2009/01/27 18:52:07 $

<VirtualHost *:80>
    <IfModule !mod_python.c>
        LoadModule python_module libexec/apache22/mod_python.so
    </IfModule>
    DocumentRoot /path/to/tewi/public_html/
    ServerName tewi.a-yasui.info
    CustomLog /path/to/log/tewi.access.log combined
    ErrorLog /path/to/log/tewi.error.log

    <Directory />
        AllowOverride All
        Options All
    </Directory>

    <Location "/">
        SetHandler Python-program
        PythonHandler django.core.handlers.modpython
        SetEnv DJANGO_SETTINGS_MODULE tewi.settings
        PythonAutoReload Off
        PythonPath "['/path/to/tewi'] + sys.path"

        # Insert filter
        SetOutputFilter DEFLATE

        # Netscape 4.x has some problems...
        BrowserMatch ^Mozilla/4 gzip-only-text/html

        # Netscape 4.06-4.08 have some more problems
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        # MSIE masquerades as Netscape, but it is fine
        # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

        # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
        # the above regex won't work. You can use the following
        # workaround to get the desired effect:
        BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

        # Don't compress images
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary

        # Make sure proxies don't deliver the wrong content
        Header append Vary User-Agent env=!dont-vary

    </Location>

    <Location "/media">
        SetHandler None
    </Location>

</VirtualHost>

余談

趣味でDjango1.1αを使っているのですが、startprojectをするとtests.pyというdoctestのファイルが出来ます。ただ、これどうやって使うの・・・?

参考とか

参考サイト: http://djangoproject.jp/doc/ja/1.0/
作成したサイト: http://tewi.a-yasui.info/

*1:いちおうtewiと名付けている。

*2:cd(pwd)とか古典的な方法だよなぁ・・・確か、何かのデーモンのコードで見つけた方法なんだよなぁ・・・