むしろ一昨日参ります。
503 Service Temporarily Unavailable
あえて表示されるままにリンクを張っておりますけど、昨日何かの拍子に参照しようとしたら、何かの拍子て読みたかったからだろ、この状態でありました。
そんなときの為にドキュメントのダウンロードができるところと、ドキュメントの参照ができるミラー的なところをtwitterで拾ったので以下に。
MiCHiLU / Django-doc-ja / overview — bitbucket.org
Django ドキュメント — Django v1.1 documentation
Django ドキュメント — Django v1.1 documentation
これだけあればどれか一つは生きているだろー。そもそも本家的なところが落ちないのが一番いいけど、どんな感じなのかも知らないからいろいろ言えないです。頑張れ頑張れぃ。
(0)
Overview - django-logging - A very brief overview of django-logging. - Project Hosting on Google Code
Screencast 2: Logging in Django, for fun and profit | Surfing in Kansas
ログをとる - スコトプリゴニエフスク通信
全く気にかけていなかったわけではないですけど、積極的に追っかけていたわけではないDjangoさんですから、例によって世の流れ的に周回遅れなのですけど、開発時、デバッグ時に超大活躍しそうなロギングツール“djangologging”が凄すぎて格好良すぎて素敵すぎた。
実行したSQLまで表示する事ができたりして、あれって思った事は全て追っかけられそう。Djangoのmiddlewareなので導入も楽々、設定もsettings.pyに追記するだけ。
詳しくは二つ目のリンク先のスクリーンキャストをご覧になって頂きたいですけど、もう全てのプロジェクトでこれを使いたいと思ったよ。全てのプロジェクトっつったって、れいあれさんしかないのだけどな。
(0)
例のあれ(仮題)・画像を扱うモデルを拵えようとしている。
例のあれ(仮題)・ 画像を扱うモデルを拵えようとしている。の2
古い記事ですけども、とりあえず上記記事が前提です。もう二年半以上前の話なんだね。まぁ、これから書く話も結構前の事でいまいちしっかりと思い出せるか不安なんだけどさ。
私が一人勝手にうっかりしている間にDjangoさんは1.1がリリースされていたりしまして(Django | The Web framework for perfectionists with deadlines)、「そいうえば全然追っかけてないし、多分動かないのだろうなぁ、とりあえず動くようにしはしておかないとなぁ、何があるかわからないし」って事で作業を開始。
実は1.0に対応するタイミングも逃していて、それはもうそこはかとなくさりげなく変更点があったりして管理画面を出すのにも手間取る有様だったのだけど、何とか完了。その中でも面倒くさかったのがImageFieldの扱い(多分FileFieldも、試してないけど)だったのでメモしておこうかなぁと。
あ、ぼやぼやしているので解決するまでが面倒だっただけで、解決法は面倒ではないです、むしろやっつけ適当対応しちゃったから。
image = models.ImageField(upload_to='images/%Y/%m/%d', height_field='height', width_field='width')
上記のようにModelで記述してファイルをアップロードするとDjangoさんの方で勝手にパスを追加してくれて、パス込みのファイル名を取れるようになります。と言うのを利用してsave()メソッド内でごにょごにょして使っていましたが、1.1から挙動が変わってしまったようで最初の保存時のsave()メソッド実行時にはまだ追加されていません。こちらとしてはパス込みのファイル名が返ってきて欲しいのに、パスなしの普通のファイル名だけが返ってきてしまいます。
save()メソッドの中で自分で追加したりとか、Djangoのソースをひっくり返して追加する処理を探したりとかいろいろやってみましたが、いちいちしっくりこない、納得できない、なんかヤだ。事前に呼んでくれないのなら、自前で呼んでやる。一発目で呼んでやる。と、
super(EntryImage, self).save(force_insert, force_update)
を最初に実行すると上手くいったりしました。良かった良かった。def save(self, force_insert=False, force_update=False):
#if not self.id == None:
# Django 1.1の仕様変更によりとりあえずセーブ
super(EntryImage, self).save(force_insert, force_update)
base, ext = os.path.splitext(self.image.field.generate_filename(self.image, self.image.name))
(中略)
org_img = Image.open(settings.MEDIA_ROOT + "/" + self.image.url).copy()
(中略)
super(EntryImage, self).save(force_insert, force_update)
これまでと扱いが変わってしまうので改悪だと思う向きもあるかと思いますけど、事前に保存されていたこれまでの挙動もそれはそれで余計な事だと感じるケースもあったと思うよ、上書きすると二回保存処理が走って気持ち悪いとか。
難しい事はよくわからないのでどっちでもいいです、とりあえず動いたしー。
(0)
DjangoCon2008 - アクセンスのおまけ - Trac
究極的には、ストレージはRDBMSでなくても対応できるような気がしてきました
それなんて(ry。
今後の課題として、DBの実装にカップリングしない集約メソッド(sumとかcountとかavgとか)を挙げていました。
だからそれなんて(ry
WO厨のウザさを全力でアピール。
期待してるよ、Djangoさん。
たぐ - django webobjects
(0)
Django 1.0 が遂にリリースされました。 | Djangoと日本の仲間たち
ついにPython製WebアプリケーションフレームワークであるところのDjangoが1.0に到達しました、目出たい。
思えば、私がDjangoなるモノに始めて触れたのは0.95がリリースされたその次の日でありました。これは狙ったわけではなくてたまたまそうなったのですけど、いいタイミングだったなぁとちょっと思っていたりして。そうそう、それまでPythonは憧れの言語で、かつ手をださないものだったので未経験でありましたよ。ある人に薦められてちょいとやってみようと思ったレベル。
その時はチュートリアルだけやって、「なるほど面白い、格好いい」とは思ったのだけども、当時ほら、WebObjectsとかが大変とても微妙な時期だったりしたからさ。なんとなくもうちょっとこっちでみたいな気分だったし、今でも“WebObjects >>>>>>> Django”みたいに思っているくらいだからあまりその気にはなっていなかったりして。
でも、その数ヶ月後、色々と状況に変化があったりもして、気持ち的にも色々やってみたくもあったので、とりあえず自分で使う用のブログっぽいものを作ろうとしてみた。あー、某スパムの人のblogkitとかいうのを凄く参考にさせて頂きました(Djangoのblogキット | スパムとか)。いや、あまり面影がないという話もあるけど、元がそういうものだからそういうものなんじゃないの。
でまぁ、別にそのアプリを「れいあれ」として採用する気なんてなかったんですよ、本当は。やってみたかったから作ってみただけ、そんなノリですから。当時のこのページはWebObjectsで稼働していて、意地でも維持してやるとかそんな気持ちも強かったですし、前述の様に“WebObjects >>>>>>>>>>>>>>> Django”とか思っていましたから(←まぁ、比べる様なモノじゃないのですけどね)。実際、最初は別ページとして公開していたりもしました。
しかしまぁ、色々思うところあり、こっちでいいかなとお乗り換え。レンタルサーバにも移行できて、部屋も静かに奇麗さっぱり。ソースも垂れ流して今の様な体制に。
現在はDjangoどころかPythonにすら縁遠い生活を送っておりますので、1.0への追従は全くできておりません。できておりませんが、「そのうち!」という気持ちだけはありますよ。なんだかんだで大好きであります、PythonもDjangoも。これからも超よろしく!
(0)
Django | Weblog | Django 1.0 beta 1 released!
9/2の1.0リリースへ向けて、こちらも順調の様でございます。オンタイム、凄くオンタイム。
ちなみにこのサイトで使っているDjangoアプリケーションは1.0上でまったく動作しません。て事だけ確認してます。それなりに追従したかった。リリース前だが既に過去形。
(0)
モデル API リファレンス : Django オンラインドキュメント和訳
Google App Engineでモデル以外にDjangoを使って遊んでいると(←遊んでいるのか)、ついついモデルの方もDjango的にやってしまって、先日なども公開フラグを使ってフラグが立っているものだけを抽出する様なカスタムマネジャが欲しくてひととおり実装して動かない、何故か動かない。……動くわけない。
てわけで、@classmethodデコレータを使ってそれっぽいヤツをでっち上げて満足した。
published = db.BooleanProperty(default=True)
@classmethod
def published_objects(cls):
objects = cls.all()
objects.filter('published =', True)
return objects
こういうのをModel内に仕込んでおけば
Object.published_objects()
などと呼び出す事ができる。
(0)
Using Django with Appengine
Adminサイトを使えない時点で同じには成り得ないわけですが、Google App EngineアプリをDjangoを活かしつつ開発してみたいと思うDjango未経験の向きの入り口として非常に良いのではないかと思ったり思わなかったりします。
(0)
Types and Property Classes - Google App Engine - Google Code
pytz - World Timezone Definitions for Python
Time zones in Google App Engine
日付変更線に近いところへお住まいの我々は困りますよね。や、別に困りはしませんが、面倒ですよね。って事で、変換しております。
最初、
timestamp + datetime.timedelta(hours=9)
なんて事をやっていたのですけど、「あんまりだなぁ」と思ってGoogleさんのドキュメントを参考にpytzを使って
timestamp.replace(tzinfo=pytz.utc).astimezone(pytz.timezone(settings.TIME_ZONE))
なんてやっていて、「settings.pyで設定したTIME_ZONEの値を使えるのがいいよ、なんかたくさん無駄なリソースが入っちゃうけど」と思っていたところへ某方面からヒントとか言って送りつけられたページ(←三つ目のURL)のソースをパクって落ち着いたのが、
import datetime
class UtcTzinfo(datetime.tzinfo):
def utcoffset(self, dt):
return datetime.timedelta(0)
def dst(self, dt):
return datetime.timedelta(0)
def tzname(self, dt):
return 'UTC'
def olsen_name(self):
return 'UTC'
class JstTzinfo(datetime.tzinfo):
def utcoffset(self, dt):
return datetime.timedelta(hours=9)
def dst(self, dt):
return datetime.timedelta(0)
def tzname(self, dt):
return 'JST'
def olsen_name(self):
return 'Asia/Tokyo'
def jst_date(value):
if not value:
value = datetime.datetime.now()
value = value.replace(tzinfo=UtcTzinfo()). \
astimezone(JstTzinfo())
return value
で、モデルの方にこのメソッドを呼び出すメソッドを書いて(return hoge.jst_date(self.created)とか)、そのメソッドをテンプレートの方でDjangoのfilterを噛まして({{ object.jst_created|date:"Y/m/d H:i:s" }}とか)表示させてます。
まー、こんなものでひとつ。
(0)
Running Django on Google App Engine - Google App Engine - Google Code
[Google App Engine] - 常山日記
各所で話題のGoogle App Engineさん、中でもDjango界に与えたインパクトは大きくて至る所で色々な事が起こっています。詳しい事は上記の常山さんとこ経由で巡って頂きたい。
さて、ここ数日私も「DjangoをGoogle App Engineで」というのに取り組んでおりますが、だんだんと馴染んできて参りました。Googleさんのエゲつないリソース群を利用できる変わりに、Djangoさんのきめ細やかさを失ったりするトレードオフなのが悩ましくもあり、かつ興味深くもあり、そして楽しくもあります! 特にGoogleさんのデータとの向き合い方とかが非常にツボであります。
いろいろ試してみてくれている先輩方(←すべからく私よりお若いが先輩だ)がいらして、私もそれを追いかけできる限り色々試してみようと思うので、ちょいちょい書いて行きたい。
だが、本日よりマリカ部。裏切ったらごめんなさい。と言うか、裏切る気でこれを書いていると思う。
(0)
DjangoでSQLAlchemy - perezvonの日記
うちみたいにblogみたいなアプリだと凄く単純な処理しか必要ないのであれだけども、いつかやってみたい様な気もするので。
(0)
django-admin.py と manage.py : Django オンラインドキュメント和訳
custom SQL から fixture に移行してみました - MiCHiLU.com
文字化けしない JSON serializer - MiCHiLU.com
例によって周回遅れも甚だしいですが、fixtureってヤツを試してみました。まだまだDjango 0.96系使ってます。
python manage.py dumpdata --indent=2 > initial_data.json
python manage.py flush
として日本語が化ける事を確認。その後、上記リンク先の「文字化けしない〜」を導入して再度実行し、日本語化けない事を確認。素晴し哉。
Djangoのドキュメントに
MySQL とフィクスチャ
残念ながら、MySQL は Django のフィクスチャに関する全ての機能を利用でき るわけではありません。 MyISAM を使っている場合、 MySQL はトランザクショ ンや制約をサポートしていないので、複数のフィクスチャファイルに対するロー ルバックを行えず、フィクスチャデータの検証も行えません。一方、 InnoDB を使っている場合、データファイル間で前方参照を行えません。 MySQL は行制 約のチェックをトランザクションコミット直前まで遅延するためのメカニズム を備えていないからです。
とあります様に、MySQLでは幾つかの制限があるのでそれなりのアプリケーションへなってしまうとバックアップとして使うのは辛そうです。MySQLにもダンプ機能はありますので、バックアップにはそちらを使えば良いでしょう。
が、私の使用目的は開発途中の仮データの作成、流し込みなので外部キーなどを考えてデータを作成、修正する事で使えそうです。記述するにはXMLよりJSON形式の方が楽そうですね。
“initial_data”というファイル名にする事で、“syncdb”系コマンドで自動的にインストールしてくれるのも便利です。
たぐ - django
(0)
Django | Weblog | Security fix released
Django | Download
国際化関連のフレームワークの脆弱性に対処したらしいです。バージョンアップしておきましょう。
0.96に留まっておかねばならない理由はかなり前に無くなってしまったので0.97開発版へ移行したいと思いはするものの、ここまで来たら正式にリリースされるのを待つ方が良い様な気もして(ry。
たぐ - django
(0)
ウノウラボ Unoh Labs: DjangoのURL逆引き機能
モデル API リファレンス : Django オンラインドキュメント和訳
先日permalinkデコレータを使ってみたので「メモを残さないとな」と思っていたこの時期にこの記事でございます。Django界は“人材”が豊富なのかこういう事が多くて非常に助かります。助かってばかりで貢献していないのがあれですけど。
私は未だに0.96に留まっている事も関係しておりますけど、url関数やらreverse関数は使用しておりませんでpremalinkデコレータだけ使っております。ちなみに“デコレータ”ってのもあまりよくわかっておりませんで、「関数をラップする関数、なの?」レベルであります。ついでだからデコレートする関数ってヤツを書こうとしていたのだけど、途中で放置しておる有り様です。
さて、最新のオンラインドキュメントによりますと、
この例では、第 2 引数に空の配列 (空のタプル) を指定していますが、これは引数 リストを渡さず、キーワード引数だけを渡したいからです。
とあります。「なんじゃらほい(←昭和の香りのするかけ声)、わざわざ空のモノを渡すのも気持ち悪いなぁ」とソースを紐解いてみますと該当関数のコメントにて
# Decorator. Takes a function that returns a tuple in this format:
# (viewname, viewargs, viewkwargs)
# Returns a function that calls urlresolvers.reverse() on that data, to return
# the URL for those parameters.
という記述がありました。合点が行きました、「URLから渡ってくる引数をキーワードの有る無しで分けて受け取っているのね」と。
そんなわけで、ビュー関数へ固定引数として渡している場合は第2引数にタプルで、キーワード引数として渡している場合は第3引数に辞書でって使い方の様です。
うちのURLはキーワード引数のみなので、デフォで空タプル付きって事になりますね。ち
たぐ - django
(0)
CoreserverでDjangoを使う | スパムとか
以前とりあげました格安レンタルサーバー“CORESERVER.JP”さんでDjangoをCGIで動かした例です。なかなかパフォーマンスも良さそう。
CORESERVER.JPさんはFastCGIも入っているらしいので、次にチャレンジする人はそちらの方向でやって頂きたい。お前がやれ。
機能面ではドリホにかないませんけども、料金は半額以下だし日本のサービスなので乗り換えるのもありかも。
(2)
Django版れいあれさん
現在当サイトで動いているblogっぽいDjangoアプリケーションを公開しました。
やっぱり“ローカルメモリ上のキャッシュ”をやめて、“データベースを使ったキャッシュ”へ戻す。インスタンス毎に生成されるっぽいのは微妙なモノがある。併用できるといいのになぁ。
モデルのget_absolute_urlへpermalinkデコレータを導入。
LastFMさんから色々データを引っぱる様にした、一応Ajaxで。
「最近の“にっき”」とか「最近の“こめんと”」とかをページングできる様にした、一応Ajaxで。
その他もろもろ細かいところを調整とか修正とか。という例のあれ。
みたいな感じの変更点。注目点は皆無。
(0)
perezvonの日記 - Mobile on Django
Djangoで携帯向けサイトを構築するためのプラグイン。
まだ、構想段階なので、以下はメモ。
との事なので、楽しみに待ちたい。
私にはトラウマがあって携帯向けサイトは作る気になれないわけですけども(←大げさ)、こういうミドルウェアがあれば作れそうな気がするよ。
(0)
プログラムやPythonの初心者に向けての出張Django勉強会です。
PythonやDjangoのインストールから、 ハンズオン形式 でDjangoを触ってみましょう。
って事らしいですよ、何だかもう定員は一杯みたいですけども。Djangoって地味に勉強会だけ人気あるよな。とか嫌な事を言ってみる。
ちなみにこの横の部屋で平行してrhacoの勉強会をやるらしいのだけども、個人的にはこちらの方に興味が。行けないけどね、例によって。
たぐ - django
(0)
tests.pyを分割する - MiCHiLU.com
そういえば、Djangoではテストを書いた事がない。基本的な書き方すら知らないな。あはははは
「そのうちやろう」と思う事が幾久しく続く様な気さえします。
とか既視感溢れる様な気がする文章を書いて誤摩化してみる試み。……誤摩化す必要ないから。
たぐ - django
(0)
サロゲートペア文字を検出するカスタムフィールド - MiCHiLU.com
newforms Modelに紐付かないformデータをバリデートする - MiCHiLU.com
そういえば、Djangoではデフォルトの挙動のままを受け入れてバリデート関係を書いた事がない(←WebObjectsの時は国際化されていなかったので書いていたけど)。基本的な書き方すら知らないな。あはははは
「そのうちやろう」と思う事が幾久しく続く様な気さえします。
はぁはぁ、なるほど、フィールドのオプションに“validator_list”と含めたりもできる様ですね。今ちょっとだけ調べてみた。
たぐ - django
(0)