Home > Django Archive

Django Archive

Djangoで簡単なサービスを作るよ。来週までに。

重い腰が上がらず、最近全く手を動かしていない。勉強記録を残そうと思って立ち上げたブログも活用しきれていない。
怠け病が発病しっぱなし。

ということで無理矢理宣言して作ってしまおうと思う。

基本的に自分用便利ツールだけど、無理矢理公開するっていったほうがモチベーションがあがるのかな。
自分を追い込まないとまたダラダラしそうだから、ドメインまで取ってしまった。

少なくとも来週までに自分で使える状態にはする。上手く行けば公開するかも??

課題は全くセンスのないデザインと、認証周りかな。

Django + mod_pythonで settingsをインポートできないエラー

僕と僕のサル以外、みんな何かを隠してる : Django を Apache で動かす(挑戦!)

Django という Python ベースの Web フレームワークがある。なんとか Apache で動かそうと思い、ドキュメントを見て悪戦苦闘している。
mod_python も Django もインストールされているのだが、どうしても EnvironmentError: Could not import settings と表示されてしまう。さて、どうしたものか・・・。

そういえば私も同じ状況になったことがある。
思えば基本的なことなんだけど、設定が微妙に間違ってたんだな。

例えば、/home/myuser/src/ に myproject というプロジェクトを作ったとすると設定はこんな感じかな。


SetHandler python-program
PythonPath “['/home/myuser/src'] + sys.path”
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE myproject.settings
PythonDebug On # 実運用はもちろんOffで

自分が間違っていたポイントは3つ。
1.PythonPathを設定していなかった
2.DJANGO_SETTINGS_MODULEの設定が「myproject/settings」となっていた
3.Apacheユーザーがディレクトリを読むパーミッションがなかった!!

当たり前と言えばそうなんですが、プロジェクトの置いてあるディレクトリをちゃんとPythonPathに設定して、DJANGO_SETTINGS_MODULEは普通にモジュールをimportするのと同じようにドット区切りで書けばOKのはず。
3はご愛嬌と言うことで許してください。

windowsでもパスをちゃんとwindows流の書き方をするだけで動くと思う。
[trac][Django][Subversion] trac と Django アプリケーションをapache+mod_pythonで

※ トラックバックを上手く送れなかった。うーん。

Djangoでどうしても上手くDRYにならないところ

うーん、こんなもんだと思いつつも悩みどころ。
十分見通しのよさとDRYのバランスは取れているとは思うんだけど。

■newformsとmodels.py
たとえば、modelに登録日などのタイムスタンプを”created = models.DateTimeField(auto_now_add=True)”なんて書いた日には、普通にform_for_modelを使うと必須エラーになってしまう気がする。
入力フォームとmodelの構造が微妙に違うときなんかも、そのままでは上手く行かない(例えば登録時にパスワードとかemailを2回入力させたり)。
単純なフォーム以外は無理矢理この二つをDRYにしたところで見通しが悪くなるだけなのかなぁ?

■urlの記述
ついついテンプレートにハードコードしちゃう。
{% url %}を使えば良いのか?
将来変更される可能性があります、、、は気になるけど。

■Javascript
上記の二つとは毛色が違うけど、サーバー側処理とJavascriptの記述はやっぱりDRYっぽくないよね。例えばURLとかdomのidとか、その他もろもろの処理がサーバーとJavascriptに混在してしまったり(←設計が悪いとも言う)。
これも上記と同じで、DRYにする仕組みを作って分かりにくくなるより、JavascriptはJavascriptだと割り切ったほうがいいのかな?
書くの嫌いじゃないし。

Djangoで画像掲示板(みたいなもの)を作りました

嫁が洋裁関連のブログを書いているんですが、そこで他の人が作ったものをアップロードできる仕組みがほしいということで、Djangoを使って作った。
画像をアップするのに複雑なやり方をすると難しそうなので、画面遷移なしで画像をアップさせて簡単に使えるようにしたつもり。

NUI みんなの作品

ブログ本体はMovableType+PHPだけど、/sui/ディレクトリ配下でDjangoを動かした。

洋裁関連なので「じゃーアップして使ってみてください・・・」というのは難しいかもしれないけど、それほど気にならない速度で動いているのはわかるかな。

ちゃんとテストせずにオープンしちゃったからバグも結構残っていると思うけど、徐々に調整していこう。

で、まだ全く追ってないんだけど、問題があったので報告。

1.末尾スラッシュが無い場合にうまく動かない

まだちゃんと見ていないが、mod_rewriteの設定が関係していそう。

2.存在しないURLで、Internal Server Errorが返る

DjangoのDebugをFalseにしたらそうなった。
404エラー関連の設定なのか、django.cgiが404のときにうまくハンドリングできていないのか。
500が返るのはさすがにかっこ悪いので、あとで追ってみよう。

あと、やっぱり一番気になるのはどれくらいこのサービスを使ってもらえるかだな。
さすがに0件だと寂しい。。。
みなさんの周りで、バッグ作ったりしている人がいたら紹介してみてください。
それから面白いアイデアがあればそれも教えてください!

なぜDjangoを使い始めたか

比較の対象は以下の3つだった。
・web.py
・TurboGears
・Django

技術論というより気持ちの話っぽいけど、それぞれ触ってみた感想を書いてみる。

■web.py
ちまたの噂ではweb.pyという一つのファイルで動作とか書いてあったのに、ダウンロードしたらいくつもファイルが入っている。
多分バージョンアップしたんだろうし本質的にはそれほど変わらないのかもしれないけど、なんとなく保留。

■TurboGears
まずインストールして簡単なサンプルを作ってみる。
テストサーバーを立ち上げて、意外と簡単に動作したのでびっくりする。

次にApacheの後ろで動かそうとしてみる。
CherryPyを立ち上げずにmod_pythonとかで動かそうとするとうまくいかない。動かすためにはなにやら黒魔術的なものが必要そう。
CherryPyを立ち上げてmod_proxyでつないで動いた。

感じたのは、なんとなくしっくりこない。
確かにアプリケーションを作るのは楽そうだし、Ajaxとの連携もできる。MochiKitもいい感じ。
でも全体的に見通しが悪い気がする。
お前は言われたとおりに作ればいいんだよ的な印象。

そしてApache+mod_pythonだけで動かない(というか自分ができなかっただけかもしれないけど)も好みじゃない。
その辺の安い共用レンタルサーバーでは動かせないと思った。

■Django
まず驚いたのはドキュメントがしっかりしている。日本語ドキュメントも充実していて素晴らしい。(活動している方ありがとうございます。)

インストールして動かしてみる。普通にmod_pythonで簡単に動いた。

Ajax連携機能は無いものの、全体の見通しが良く黒魔術的なものも少ない。
Ajaxは適当に自分で実装すればいいやと割り切る。

確かにRuby on Rails的なフレームワークとはちょっと違うが、これくらいの温度感が嬉しい。見通しが良い分、自分でアプリケーションを作っている感覚が強いと思った。

■結論
結局Djangoが一番しっくりきた。自分にとってすごくわかりやすかったし。
誤解を招くかもしれないけど、Windowsで開発するよりもLinuxで開発したほうが分かりやすいというのと同じような感覚を覚えた。

Django newformsのImageFieldを使う

画像アップロードを作りたくて、Django newformsのImageFieldを使ってみた。
ファイル名周りでいろいろ問題がありそうだけど、ユーザーがアップしたファイル名はどうせ使わない仕様のつもりだったので、まーいいかと思って試した。
どうやらリリースには含まれていないので、ここからパッチを入手。
#3297 (newforms: Implement FileField and ImageField) - Django Code - Trac

現時点で最新のパッチを使った。

djangoと同じディレクトリ(ここでは$HOME/local/lib/python/site-package)にパッチファイルを置いて以下のコマンドを実行

patch -p0 < 4921-newforms-file-imagefield.diff

フォームの定義はこんな感じ

from django import newforms as forms
class ImageForm(forms.Form):
image = forms.fields.ImageField(widget=forms.FileInput(), required=True)

次に実際にファイルを読み込んでサムネイルを保存するところのサンプル。
これを少し改造していけばそれなりに動くものになるかな。
(微妙に省略していますが雰囲気はこんな感じ)

from cStringIO import StringIO
from PIL import Image
 
small_size = 200, 200
filepath = ‘/tmp/hoge/fuga.jpg’
 
post_data = request.POST or None
post_data.update(request.FILES) # 注意:ファイル情報はPOSTじゃなくってFILEに入るよ
 
form = ImageForm(post_data or None)
 
if form.is_valid():
form_data = form.clean_data
image = form_data['image']['content']
 
im_thumb = Image.open(StringIO(image))
im_thumb.thumbnail(small_size)
im_thumb.save(filepath)
[/code]

[補足]さくらインターネット、CGIでDjangoを動かす

さくらインターネット、CGIでDjangoを動かす
上記のおとといのエントリーでDjangoを動かす話をしたが、大事なことを忘れてた。

Djangoをインストールして普通に動かそうとすると、mysql接続で以下のエラーが出た。
※ちなみに、動かしているのはリリース版のバージョン0.96。

CODE:
  1. File "build/bdist.freebsd-4.10-RELEASE-p24r1-i386/egg/MySQLdb/connections.py", line 198, in __init__
  2. File "build/bdist.freebsd-4.10-RELEASE-p24r1-i386/egg/MySQLdb/connections.py", line 280, in set_character_set
  3. _mysql_exceptions.NotSupportedError: server is too old to set charset

仕方が無いので以下のDjangoのソースをちょっといじって無理やり動かした。
いじったのはこのファイル。
$HOME/local/lib/python2.4/site-packages/django/db/backends/mysql/base.py

83行目に「'charset': 'utf8',」という行があるが、これをコメントアウトする。
普通にutf-8で動かしているなら、これでも問題ないはず。

うーん、この辺がイレギュラーであまりよろしくないけど、他に良い解決方法を知っていたら教えてください。

2007/09/25追記
さらに補足です。
さくらインターネットでDjango、再び

さくらインターネット、CGIでDjangoを動かす

自宅サーバーにDjangoを入れてちょこちょこいじっていたが、httpd.confのMaxRequestsPerChildを1に設定してもそこそこ動いていた。
ということはCGIでも意外と動くんじゃないの?ということでさくらインターネットの共用サーバーに入れてみた。

参考にしたのは以下のサイト
sh1.2 pyblosxom : CGIでDjangoを動かす
oqreの日記 - さくらインターネットでDjango

まずは準備でDjangoとMySQLdbを"$HOME/local"にインストール。
Djangoのバージョンは0.96を入れたが、この辺はoqreさんの日記とほぼ同じ。

$HOME/localにインストールしたので環境変数に以下を追加

setenv PYTHONPATH $HOME/local/lib/python:$HOME/local/lib/python/site-packages
setenv PATH $HOME/local/bin:$PATH
setenv LD_LIBRARY_PATH $HOME/local/lib

次にsh1.2 pyblosxomさんの情報を参考に以下のサイトからdjango.cgiを取得。
#2407 ([patch] CGI Support for django) - Django Code - Trac

32行目に以下の行を追加

sys.path.append('/home/XXX/local/lib/python')
sys.path.append('/home/XXX/local/lib/python/site-packages')

$HOME/srcにソースを置くことにしたので、95・97行目を以下に変更

sys.path.append("/home/XXX/src")
os.environ['DJANGO_SETTINGS_MODULE'] = 'XXX.settings'

django.cgi編集の最後は、環境変数の設定。
これが抜けているのに気付かなくって苦労した。
結局1行目の#!部分で渡すことにした。
参考:「さくらのレンタルサーバ」で Python外部モジュールを使う

#!/usr/bin/env PYTHONPATH=/home/XXX/local/lib/python:/home/XXX/local/lib/python/site-packages python

django.cgiは、最終的に(※)"/django.cgi"でアクセスできる場所(ルートディレクトリ)に置いた。

次はmod_rewriteの設定。
今回は都合により、特定ディレクトリ配下でDjangoを動かすように設定したためこんな感じにしてみた。
実はここではまったんだけどそれは後で。(※)

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^XXX/(.*)$ /django.cgi/$1 [QSA,L]

これでDjangoが動いた。
簡単なアプリケーションを作るつもりなので、動くようになったら公開します。
これであまりストレスを感じないスピードで動いてくれたら、ちょっとしたサイトを作るのに手軽にDjangoが使えそうだな。

追記 2007/04/18
このまま動かしたらmysql接続でエラーが出るので以下のエントリーで補足を書いた。
[補足]さくらインターネット、CGIでDjangoを動かす

※mod_rewriteの設定

まず最終的な環境はこんな感じになった
・ドメイン:xxx.example.com
・エイリアス設定したディレクトリ:$HOME/www/xxx/
・django.cgi:$HOME/www/django.cgi
・.htaccess:$HOME/www/.htaccess

最初にはまったのは、.htaccessとdjango.cgiを特定ディレクトリ配下に置いたら想定どおりに動かなかったこと。
$HOME/www/xxx/yyy/.htaccess ⇒ $HOME/www/xxx/.htaccess
$HOME/www/xxx/yyy/django.cgi ⇒ $HOME/www/xxx/django.cgi
上記のように変更。

次にさくらインターネットのmod_rewriteでは以下の設定では動かなかった。

RewriteRule ^/XXX/(.*)$ /django.cgi/$1 [QSA,L]

ルートディレクトリの/を除けば動くようだけどなぜだか分かりません・・・。
サブドメイン+Aliasを使ってるけど関係ないよなー。

この二つが重なって結構悩んでしまいました。。。

Home > Django Archive

Return to page top