daemonfreaks.com

Djangoのテンプレートでsettings.pyのMEDIA_URLを参照

posted by jun-g at Tue, 25 Sep 2007 01:36 JST

そういえば静的なコンテンツを一切扱ってなかったなと思い、まず、ドキュメントのmod_python で Django を動かす - メディアファイルの提供を参考にしてApacheの設定を変更。元々/django/以下をdjangoで動くように設定していたので、

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

とした。後はdjango/media/以下にアプリケーション毎にディレクトリを掘って、その中にメディアファイルを入れればOK。

しかし、テンプレート内の画像タグなんかでURLを全部絶対パスで書いちゃうと可搬性が下がるという問題に気付いた。で、settings.pyにMEDIA_URLっていう設定があった事を思い出したので、それをテンプレートから参照する方法を調べてみたところ、やっぱり同じ事考えている人はいた。

テンプレート上でのMEDIA_URL呼び出しについて その2 | pythonでつくるskyfish開発ブログ

上記ページのeveresさんのコメントを参考にsettings.pyに、

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = \
    global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'myproject.context_processors.media',
    )

を追加。で、Djangoプロジェクト直下にcontext_processors.pyを作成し、その中に、

from django.conf import settings
def media(request):
    return {'MEDIA_URL': settings.MEDIA_URL}

と書いた。generic viewsを使っているので、以上でテンプレート内で{{ MEDIA_URL }}と書けるようになった。自前のviewsを使用している場合はcontextにRequestContextを指定しないといけないようなので、忘れないようにしよう。

そういえばドキュメントのコンテキストのサブクラス: RequestContextで、TEMPLATE_CONTEXT_PROCESSORSの値のデフォルトは

("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media")

になっている、と書かれているけど、自分の環境ではdjango.core.context_processors.mediaという値は含まれていなかったし、実際django/core/context_processors.pyの中にはmediaという関数は存在しなかった。バージョンが違うからかな…?

Djangoを使ってみてる その2

posted by jun-g at Sun, 23 Sep 2007 20:54 JST

チュートリアル通り進めた場合、チュートリアルその3のURLconf の脱カップリングで行った内容だけだとDjangoアプリケーションの切り離しは出来ない。何故ならviews.pyに

from mysite.polls.models import Poll

と書いてしまっているから。これだとmysite以外のプロジェクト内に移動した場合にコードの修正が発生してしまう。完全に切り離すには、

from polls.models import Poll

と書かなければならないと思う。チュートリアルその4まで見たけどこの事についてはどこにも触れられていないっぽい。誰でもすぐ気付くからかな?

ちなみに、Django付属の開発用サーバではimport文を上記のように書き換えてもそのまま動くけど、Apache+mod_python上ではPythonPath上にpolls.modelsが見つからない、というエラーになった。ドキュメントのmod_python で Django を動かすには、DjangoプロジェクトおよびDjangoアプリケーションそれぞれの親ディレクトリをPythonPathに含める必要がある、と書いてあった。なので例えば/home/jun-g以下にチュートリアル通りの以下のようなディレクトリ構成で配置した場合、

mysite
  |
  +-- polls

PythonPathには以下のように書く必要がある。

PythonPath "['/home/jun-g', '/home/jun-g/mysite'] + sys.path"

っていうポイントにちょっとだけ引っかかった。

後、作成した自分用のアプリの入力フォーム生成とデータのバリデーションをnewformsを使うように修正した。泥臭いコードがかなり減ったけど、もうちょっと適切なWidgetを適用すればまだまだ整理できそうな感じ。そういえば、ドキュメントにoldformsの事は知らなくて良い、と書かれていたので、oldformsには一切触れず。

あ、generic viewsもmiddlewaresもまだ全然触っていない。これは次のアプリで使ってみることにしよう。後、動作環境をApache+mod_wsgi上に移す、とかもやりたい。

HIGHLAND SPECIAL! at TRIANGLE

posted by jun-g at Sat, 22 Sep 2007 15:59 JST

ANDY C目当てで行ってきたよ。

プレイ時間は1時間だけやと思ってたらたっぷり2時間あった。で、知らずに前半飛ばしまくったので、後半左膝が痛くてまともに踊れず…。でも楽しかった。

そうそう、これまでの反省を生かして、今回はフロアの真ん中ぐらいの壁よりの位置をキープしてたんやけど、フロアを出入りする人の流れの影響をほとんど受けないので、気が散る事なく楽しめた。ポジション重要。今後もあの辺りで楽しむ事にしよう。

次は10/12のHappyNuttyに遊びに行く予定。L.P.U.10周年、そしてSLIPMATT初来阪…わくわく。SL2のレコード持っていってサインしてもらおーっと。

そういえば、先月でL.P.U.のリアル店舗が閉店したんやった。その事について色々思う事があるのでエントリを書こうか書くまいか悩みつつまだ書いてないな。気がむいたらそのうち書く。ちなみにL.P.U. ONLINE STOREは引き続き営業中らしい。

Djangoを使ってみてる

posted by jun-g at Fri, 21 Sep 2007 13:07 JST

個人的なメモツールをいくつか作る必要があったので、勉強がてらDjangoでひとつ作ってみた。DjangoはFreeBSD portsのwww/py-django-develからインストールした。バージョンは2007/05/25あたりのスナップショットみたい。

とりあえず最初はチュートリアルを見ながら始めた。で、だらだらやってた割にすぐできた。やっぱり和訳ドキュメントが揃ってると便利やなぁ。でも、すぐ出来ただけあってとりあえず動きました的な実装になってしまったので、まだまだ改善の余地有り。formsとかgeneric viewsとか全く使ってないし。

そういえばなんか時間が-9時間ずれてしまって、ちょっとだけハマった。原因はsettings.pyのTIME_ZONEに「Asia/Tokyo Japan」と書いてしまっていたから。正しくは「Asia/Tokyo」だけで良いみたい。settings.pyに載っていた参考URLのこのページには「Japan」まで書かれてたから、その通り書いただけなんやけどな…。

Apache+mod_pythonで動かす為の環境構築まで完了したので、コードをちょっとづつ修正していくか。

Page 0 of 1  >>