Tag/templates
Djangoで使ってる個人用markupを公開してみたよ。
Django の markup ってアプリケーションを使うと、 テンプレートタグで restructuredtext なタグを使えて物凄く便利。
実際にこのブログも reStructuredText で書いているんですが、 外部リンクもサイト内リンクも同一に扱われるのがちょっと不満だった。 外部リンクには別のクラスつけるとか、新規ウィンドウで開くとか、 色々要望は出てくるもんで。
で、こそこそ自分用に作ってた訳ですが、 某 endless 氏から「それ、公開しちゃいなYO!」な声が掛かったので、 とりあえず公開してみますです。
Django の markup の置き換えを念頭に作ったので、 同居は出来ないと思われます。 それと、入れ替えたところで、 変わるところは外部リンクに rel="external nofollow" がついて、 target="_blank" がつく程度。 ぶっちゃけ、大した事ない訳ですが。
autoescape 以降に作ったので、 Django の開発版@6671以降でしか動作しないかも。
- Posted at:
- 2007/12/01 13:34:36
- 3 Comments
- 0 TrackBacks
- Trackback:
- http://humming.via-kitchen.com/2007/12/01/my-markup-on-django/trackback/
Djangoのコンテクストプロセッサーを使ってみたよ。
Django のコンテクストプロセッサーを使ってみたよ。
サイト名とかドメインとか決まりきったものを、 ビューから渡したりテンプレートタグにしたりするのもどうかなぁ? と思ってた。
スパムとか さんの djblogkit をのぞいてみると、 TEMPLATE_CONTEXT_PROCESSORS に自作のコンテクストプロセッサーを追加して、 テンプレートに変数を渡してる。ので、コレを参考にして(ほぼパクって)やってみる。
# vim: fileencoding=utf-8 :
from django.conf import settings
from django.contrib.sites.models import Site, RequestSite
def site(request):
"""
サイト名とドメインをテンプレートに落とす。
"""
# django.contrib.sitesがインストールされてるかチェック。
if Site._meta.installed:
current_site = Site.objects.get_current()
else:
current_site = RequestSite(request)
# サイト名の取得。
if hasattr(settings, 'SITE_NAME'):
SITE_NAME = settings.SITE_NAME
elif hasattr(current_site, 'name'):
SITE_NAME = current_site.name
else:
SITE_NAME = u''
# ドメインの取得。
if hasattr(settings, 'SITE_DOMAIN'):
SITE_DOMAIN = settings.SITE_DOMAIN
elif hasattr(current_site, 'domain'):
SITE_DOMAIN = current_site.domain
else:
SITE_DOMAIN = u''
return {
'SITE_NAME' : SITE_NAME,
'SITE_DOMAIN' : SITE_DOMAIN,
}
def path_info(request):
"""
PATH_INFOをテンプレートに落とす。
"""
# request_pathにすべき?
return {
'PATH_INFO' : request.path,
}
コレを context_processors.py とかにして適当な場所に保存。 今回はとりあえず試しなのでプロジェクトディレクトリ直下に保存してみた。 で、組み込む為に settings.py に設定を追記する。
TEMPLATE_CONTEXT_PROCESSORS の項目自体は、デフォルトだと settings.py には無い。 ので、 django.conf.global_settings.py からコピペして持ってくる。
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'myproject.context_processors.site', # <--- コレを追記
'myproject.context_processors.path_info', # <--- コレを追記
# 'django.core.context_processors.request',
)
これでテンプレートに変数として落ちて来てる(ハズ)。 毎回レスポンスにセットする様な変数なんかは、コンテクストプロセッサー使った方が全然楽ちん。 だという事を今更知ったよ。
- Posted at:
- 2007/09/23 04:52:25
- 0 Comments
- 0 TrackBacks
- Trackback:
- http://humming.via-kitchen.com/2007/09/23/use-context-processor-on-django/trackback/
DjangoでXMLとか吐くメモ
Django で XML とか吐くメモ。 template 部分の勉強も含めて簡単に試してみた。
まずは簡単に静的なファイルの吐き出し。
xml_test1.xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<errorcode>0</errorcode>
</response>
views.py
from django.http import HttpResponse
from django.template import loader, Context, RequestContext
def xml_test1(request):
t = loader.get_template('example/xml_test1.xml')
c = Context()
return HttpResponse(t.render(c), mimetype='text/xml; charset=utf-8')
HttpResponse の引数に mimetype を渡す事でヘッダに適応してくれる。念のために charset も指定しておく方が良いと思う。 Firefox で確認してみたら、 XSLT に関連づけされていないのでドキュメントツリーが見れた。
次に適当に変数を渡してみる。
xml_test2.xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<errorcode>{{ errorcode }}</errorcode>
{% if message %}
<message>{{ message }}</message>
{% endif %}
</response>
views.py の続き。
def xml_test2(request):
p = {}
p['errorcode'] = 1
p['message'] = 'This is test message.'
t = loader.get_template('example/xml_test2.xml')
c = Context(p)
return HttpResponse(t.render(c), mimetype='text/xml; charset=utf-8')
Firefox で見るとこんな感じ。
<response>
<errorcode>1</errorcode>
<message>This is test message.</message>
</response>
ちゃんとパースされてる。(当たり前)
ココでちょっとソースを見てみると render_to_string なんてのもある。 引数は全部で3つで、それぞれテンプレートのパス・テンプレート変数(dictionary)・コンテクスト(context_instance)。うち必須はテンプレートのパスだけ。 今度はコレを使ってテストみる。テンプレートはさっきの xml_test2.xml を使い回し。
def xml_test3(request):
p = {}
p['errorcode'] = 0
return HttpResponse(
loader.render_to_string('example/xml_test2.xml', p),
mimetype='text/xml; charset=utf-8'
)
Firefox で確認するとこんな感じになった。
<response>
<errorcode>0</errorcode>
</response>
今回は message をテンプレートに渡してないので、 message の部分はちゃんと非表示になってる。
以下まとめ?
- 基本的には HTML と操作は同じ。
- render_to_response はデフォルトだと使えない。
- mimetype 指定である程度はこなせる。
- もっと詳しい情報は 本家サイト や 和訳ドキュメント で。
- Posted at:
- 2007/07/04 03:08:58
- 0 Comments
- 1 TrackBack
- Trackback:
- http://humming.via-kitchen.com/2007/07/04/output-xml-file/trackback/
テンプレートを使ってのメール送信
コメントやトラックバックを受け取ったときにメールを飛ばすようにしていたのですが、やっぱソース中にメールの内容とか書いてると見づらいし、内容を変更したくなった時とかかなり大変。
で、「何か良い方法はないかなぁ?」なんてネットを徘徊していると rossp.org さんにいい感じの記事が。どうやらテンプレートエンジンでメール本文をレンダリングする模様。まさにこういうのを探してた!
具体的には、とりあえず受け取りたいメール内容のテンプレートを作成。今回はとりあえず mail.txt とかにしてみた。中身はまだかなり適当。
{{ title }}
Entry Url : http://{{ site.domain }}{{ object.get_absolute_url }}
で、後は views.py とかメール送信したい所でテンプレートエンジンを使って本文を組み立ててメールを送信する。
以下は views.py の抜粋
from django.core.mail import send_mail
from django.template import loader, Context
from django.contrib.sites.models import Site
# (省略)
if form.is_valid():
# コメントの保存。
comment = form.save()
# ココからメール処理。
title = 'Post new Comment.'
t = loader.get_template('mail.txt')
c = Context({
'title' : title,
'object' : comment,
'site' : Site.objects.get_current(),
})
send_mail(title, t.render(c), 'webmaster@example.com',
['hige@example.com',], fail_silently=False)
return HttpResponseRedirect(comment.entry.get_absolute_url())
この形で作っておけば、何かと変更したくなってもすぐに対応出来て素敵過ぎます。 やっぱりまだまだ知らない事が多いなぁ。としみじみ実感。
トラックバック受信時も同じ様な形でメール送信を実装。これで気まぐれにちょくちょくメール内容とか修正出来るし、外向けにメールを飛ばすのも苦にならなそう。
また一つ Django が好きになりましたとさ。
ps. tenkao さんの コチラ おかげでまた一つサイトのデザインが fixed に近づきました♪本当にありがとうございます。
- Posted at:
- 2007/05/30 03:31:23
- 0 Comments
- 0 TrackBacks
- Trackback:
- http://humming.via-kitchen.com/2007/05/30/send-email-via-templates/trackback/