ラベル Django の投稿を表示しています。 すべての投稿を表示
ラベル Django の投稿を表示しています。 すべての投稿を表示

2010-05-13

Googleドキュメントにあるドキュメントをランダムで取得してメールをする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Googleドキュメントにいろいろメモを残しているのに全然見返すことをしていないない・・・
そんな私のためにGoogle App EngineでGoogleドキュメントの内容をランダムで取得してメール送信するものを作ってみました。

機能としては、
・文章のみをメール送信します。スプレッドシートなどは送信しません。
・取得対象はランダムです。
・文章を送信対象外にするリストを持ち、リストに追加したドキュメントは送信しません。
・oAuthを利用します
てな感じです。

エラー処理が少々大雑把なため
ドキュメントが一つもなかったり、すごく大量にあった場合にどうなるかはわかりません。

Djangoのアプリケーションになっています。
http://docs.google.com/leaf?id=0BydytAINVs9VM2E5NWRlMGItNWM1Yy00OTZhLWI5MTctYjQ0MDliNWJhMjI0&hl=ja
にアプリ部分だけzipしたものを置いてみましたので、もしご興味があればご利用ください。
zipを解凍してできたディレクトリをDjangoプロジェクトのルートに配置して利用できるように設定します。
ディレクトリ内のsettings.pyは編集する必要があります。

実行には、gdataが必要です。
以下から取得できます。
http://code.google.com/p/gdata-python-client/

Google App Engine patchも必要な気がします。
こちらで利用しているモジュールも使っているような気がします。
以下から取得できます。
http://code.google.com/p/app-engine-patch

app.yamlには
- url: /gdoc_sender/.*
  script: common/appenginepatch/main.py
  login: admin
みたいなエントリを追加する必要があります。

あと、queue.yamlを以下のような感じで。
queue:
- name: default
  rate: 5/m

- name: gdoc-sender
  rate: 5/m

そして、cron.yamlを以下のような感じで。
cron:
- description: daily mail send
  url: /gdoc_sender/set_queue/
  schedule: every day of month 09:00
  timezone: Asia/Tokyo

こんなメモを残していたのか・・・
と毎日一つは残したメモを見返すようになりましたとさ。

2010-01-03

DjangoとRailsの個人的感想

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近、DjangoとRailsをそれぞれ軽く触っています。

完全に個人的な意見で参考にならないとは思いますが
両方使った上での個人的な感想は
本当ならばDjangoだけを利用したいけど仕事で使うならばRailsかなぁ
といった感じです。

個人的にはDjangoの方がしっくりくるものがあります。

Djnagoのいいと思っているところをあげてみると
・言語的にPythonの方がRubyの方が好き
 完全に個人的な趣味です
 どちらも優れた言語だと思っているのですが、
 誰が書いても似たようなコードになるような言語仕様であるPython
 多様性は善ということで同じコトをいろいろ表現できるRuby
 とそれぞれのポリシーのうちPythonのポリシーの方が個人的に好きという感じです。
・フレームワークとしてすっきりまとまっている気がする
 RailsはActiveRecordなどちょっと書くだけでいろいろ動いちゃうのがちょっとなじめないので
 書かなければならない量がDjangoの方が個人的感覚にはあっている感じです。
・Google App Engineで使える
 Railsも使えるみたいですが、Ruby on Rails on JAVAで動くということなので
 ちょっとonし過ぎな印象を持っています。

Railsのいいと思うところは
・Migration
 個人的には、Migration仕組みはとてもステキだと思っています。
 DjangoにもsouthというMigrationのような機能をもつツールもあるようですが、
 Migrationよりかはちょっと面倒な印象です。(使っていないで言っています。)
 southについては
 http://nakagami.blog.so-net.ne.jp/2009-12-10
 が参考になります。
・テスト関連がすっきりしている気がする
 modelやcontrollerを書いたらテストをどこにテストを書くのかとかがDjangoに比べて明確な印象です。
 テストをしっかりやりなさい!という意思が感じられるのがステキな気がします。
 またrspecの存在もステキな気がします。
 pythonにもpyspecというのもあるのですが、rspecに一日の長がある感じがします。
 pyspecについては
 http://pyspec.codeplex.com/wikipage?title=Home_jp&referringTitle=Home
 が参考になります。
・情報量が多い
 DjangoよりもRailsの方が情報が多いです。Railsの方が調べた時の見つけやすさ気がします。

ということで
個人的にはGoogle App Engineを使いたいのでDjangoが本当はいいのだけど
Migrationによるスキーマ管理からテストまでの開発の全体を通した開発のしやすさと情報の多さから仕事ではRails使った方がいいかなぁと思ったわけです。

逆にMigration相当の便利なツールがあれば
仕事でもDjangoを使ってもよいのかなぁとか思ったりしています。

完全に個人的な感想でした。

ちなみに

はDjangoのことを知る上ではすごく参考になりました。
ネットでちょっとDjangoのことを調べてから読むと全体像がすごく分かりやすく把握できました。
そしてそんな機能もあったのねと関心もしてみました。

 

2009-11-23

DjangoでGETする際などに同じパラメタが複数設定されているものを取得する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
index.html?a=1&a=2&a=3
みたいなものを受け付けた時のことです。
通常だと
val = request.GET["a"]
みたいな感じで取得するわけですが、上記のような時は
3
とか一つしかとれません。
取得するには
list = request.GET.getlist("a")
のようにgetlistで取得する必要があるのでした。

2009-11-03

Djangoでいきなりテンプレートへ渡す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Djangoで説明ページなどでなんの処理もしないでいきなりテンプレートに渡したいと時があります。
その際には、汎用ビューの一つの
django.views.generic.simple.direct_to_template
を使えばOKです。
例えば/testというページにリクエストが来たらtemplate/test.htmlに飛ばしたいときは
urls.py
に以下のような感じで書くとよい感じです。

urlpatterns = auth_patterns + patterns('',
('^test/$','django.views.generic.simple.direct_to_template',
{'template': 'test.html'}),
) + urlpatterns

どうやるんだろうと思っていたら、Google App Engine Patchのサンプルのトップページでも使っていました。

2009-10-10

Djangoでjsonを読み取る

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Djangoでjsonを使おうと思うとjson形式で出力することはいっぱい見つかるのですが、どっかのAPIとかを使った出力がjson形式でそれをパースしようと思ったときの情報が少ない感じがします。

json形式をパースするにはDjangoの中にsimplejsonというものが付属しているようなのでそれを利用すればよいそうです。

以下のような感じです。

import django.utils.simplejson as json

def parse_json(json_str):
obj = json.loads(json_str)
return obj


こんな感じで使う感じです。
json_str='["foo", {"bar":["aaa", "bbb", "ccc"]}]'
ret = parse_json(json_str)
foo = ret['foo']

でもDjango1.1からはsimplejsonがDjangoに組み込まれなくなったようなことをどっかで見たような気がしないでもないです。

simplejsonに関して詳しくは以下を参考にしてください。
http://undefined.org/python/#simplejson
ちなみにjson形式で出力を行うには、以下を参考にしてくみてください。
http://djangoproject.jp/doc/ja/1.0/topics/serialization.html

2009-09-18

Djangoのテンプレートのフィルタのescapejs

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Djangoさんのテンプレートには、フィルタというものがついていてテンプレートにセットされた値にテンプレート側で値に対して修正を書けることができます。

Djangoさんのテンプレートないでjavascriptを記述していて、そのスクリプト内にある文字列を変数に代入しようとして

var aaa = "{{ test }}";

なんてしておいた時に、testの値に改行などが入っていた際には、javascriptが動かなくなります。

そんな感じを防止するために

var aaa = "{{ test|escapejs }}";

のような感じでescapejsというフィルターを使うとエラーにならないようにしてくれます。

でも、html的に安全でないとかいう感じで書いてあったので、私はこんな感じにしてみました。

var aaa = "{{ test|striptags|escapejs }}";


便利なDjangoのテンプレートのフィルターは、
http://djangoproject.jp/doc/ja/1.0/ref/templates/builtins.html#ref-templates-builtins-filters
で確認できます。

2009-07-22

jQueryでcookieを

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
jQueryを使うといろいろステキなわけですが、cookieの取り扱いもステキです。
利用方法は、
http://blog.4galaxy.net/28.html
を見ていただければ完璧です。

ちなみにGoogle App EngineでDjangoを使うときに便利なapp engine patchを利用しているとjQuery関連が一つにまとめられているのでcookieマネージャであるjquery.cookie.jsも同じ場所においておくことにします。

場所は、
プロジェクトルート/common/jquery/media
において
プロジェクトルート/common/jquery/settings.py
を以下のようにjquery.cookie.jsを追加します。

from ragendja.settings_post import settings
settings.add_app_media('combined-%(LANGUAGE_CODE)s.js',
'jquery/jquery.js',
'jquery/jquery.fixes.js',
'jquery/jquery.ajax-queue.js',
'jquery/jquery.bgiframe.js',
'jquery/jquery.livequery.js',
'jquery/jquery.form.js',
#追加しました
'jquery/jquery.cookie.js',
)

これでcookieが簡単に使えちゃいます。

以下のような感じです。

#セット
$.cookie('attr','val',{ expires: 30 });
#ゲット
test = $.cookie('attr');

2009-07-21

google app engine pathではjQueryが組み込まれている

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App EngineでDjangoを使うためにpatchを利用しているわけですが、settings.pyの中の
INSTALLED_APPSにjqeuryとか書いてあったのです。

INSTALLED_APPS = (
# Add jquery support (app is in "common" folder). This automatically
# adds jquery to your COMBINE_MEDIA['combined-%(LANGUAGE_CODE)s.js']
# Note: the order of your INSTALLED_APPS specifies the order in which
# your app-specific media files get combined, so jquery should normally
# come first.
'jquery',
・・・
)

これを書いておけばmediautilsでまとめあげたjavaスクリプトを読み込んでおけばjqueryも使えてしまうということなのでした。
具体的に利用できるものとしては、
プロジェクトルート/common/jquery/settings.py
に書いてありますが、以下のものが利用できるようです。
jquery.js
jquery.fixes.js
jquery.ajax-queue.js
jquery.bgiframe.js
jquery.livequery.js
jquery.form.js

jQueryも使おうかと思ったので、このjqueryのエントリも残しておくことにしました。

2009-07-20

google app engine patchのmediautils

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
google app engine patchにはmediautilsなるものが利用できるようです。
内容的には、
http://code.google.com/p/app-engine-patch/wiki/MediaGenerator
を見るのが一番なのですが、用は自分の作ったアプリケーションで利用するjavaスクリプトやCSSを一つのファイルにまとめて圧縮してくれるというもののようです。

mediautilsは最初の設定から利用できるようになっています。
関係するsettings.pyの内容は以下の部分のようです。
実際にはちょっと自分で買えている部分はあります。

LANGUAGE_CODE = 'ja'

LANGUAGES = (
('ja', 'Japanese'),
('en', 'English'),
)

#ここに書かれているファイルにまとめられるようです。
#ここに纏め上げるjavaスクリプトやcssを書くようです。
COMBINE_MEDIA = {
'combined-%(LANGUAGE_CODE)s.js': (
'.site_data.js',
),
'combined-%(LANGUAGE_DIR)s.css': (
'global/look.css',
),
}

MEDIA_VERSION = 1

INSTALLED_APPS = (
# ...
'mediautils',
# ...
)


テンプレートでは、

<link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}combined-{% if LANGUAGE_BIDI %}rtl{% else %}ltr{% endif %}.css" />
<script type="text/javascript" src="{{ MEDIA_URL }}combined-{{ LANGUAGE_CODE }}.js"></script>

と指定して利用するようです。

追加するファイルは、プロジェクトのsettings.pyにすべて書いておいてよいのですが、各アプリケーションで個別に追加することもできるようです。
追加するjsファイルをアプリケーションのディレクトリの下にmediaというディレクトリを作って、さらにアプリケーションのディレクトリにsettings.pyを作って以下のような感じに書けばよいみたいです。

from ragendja.settings_post import settings
settings.add_app_media('combined-%(LANGUAGE_CODE)s.js',
'myapp/code.js',
)


いまいち便利さがよくわかっていないのですが、サンプルでも使っているしpatchをいろいろ使うには利用した方がよさそうな気もするので、とりあえずmediautilsは使っていってみようかと思います。

Google App Engine patchを利用している時にテンプレートでMEDIA_URLが取得できなかった

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
google app engine patchを利用して遊んでいます。
画像をおいて参照しようと思ったのです。
デフォルトの設定そのままな感じでは
/media
の下に画像をおいて
テンプレートで
<img src="{{ MEDIA_URL }}global/logo.png" alt="" />
と書いておけば利用できるようにサンプルを見るとできそうなので自分の作ったアプリでも試してみたのですが、最初は{{ MEDIA_URL }}を解決してくれませんでした。
そしてサンプルではちゃんと解決してくれるわけです。

これは、views.pyで
from django.shortcuts import render_to_response
としていたのがいけなくて
from ragendja.template import render_to_response
としないといけなかったようです。

そしてこの変更をしたら
render_to_responseを使い方も変更が必要でした。
requestを渡してあげる必要があるようです。
以下のような感じです。

def index(request):
payload = dict()
payload['test'] = 'testtest'
#変更前のコード
# return render_to_response('test_index.html', payload)
#変更後のコード
return render_to_response(request,'test_index.html',payload)

2009-07-07

Djangoのテストケース

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Djangoでテストをするときは、
python manage.py test
とすることでいい感じでテストケースを探してくれてテストをしてくれるわけなのです。

とりあえず共通的な処理をするものをプロジェクトの下に
lib
というディレクトリを作って、この中に共通処理をする関数を入れた
common.py
というのを作って、そのテストを行う
tests.py
を以下のような感じで作ってみました。

from django.test import TestCase
from lib.common import func

class GmapHelperTestCase(TestCase):
def setUp(self):
pass
def test_func(self):
self.assertEquals('aaa', 'bbb')

そして
settings.py

INSTALLED_APPS

lib
を追加してみたのですが、テストケースを発見してくれませんでした。

Djnagoの説明を見ると自動で発見するテストケースは
models.pyに記載したDoctestか
そのディレクトリにあるtests.py
と書いてありましたので、
libの下に
models.py
と空のファイルを作ることで発見してくれるようになりました。

共通処理をするものをこういう形で書くのが本当によいのかどうか、ちょっとわからないのですがこんな感じで進めてみます。

ちなみにどのテストケースが実行されているかを確認するには
python manage.py test --verbosity=2
とすると確認できます。

2009-07-06

Google App EngineでDjangoは、helperからpatchにしてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
http://kingyo-bachi.blogspot.com/2009/06/google-app-enginedjango.html
でGoogle App EngineでDjangoを利用するには、Google App Engine Helperが便利と書いてみましたが、
manage.py test
を実行するとGoogle App Engine Helperのテストエラーが出てしまいました。
私の環境がwindowsであることが原因な気がしつつ、そしてどっかいい感じにパスを通せばなんとかなるような気がしたりしつつ調べていたら
Google App Engine patch
という方がいい感じな気配なので切り替えました。

Google App Engine patchでは、Djangoの機能をGoogle App Engine上で使えるものが多くなっています。

Google App Engine patchは
http://code.google.com/p/app-engine-patch
から取得できます。
こちらからダウンロードしたものを解凍すれば、そのままサンプルになっています。

Google App Engine patchには、Djangoの1.0系のzipファイルも含まれているので自分でDjangoのzipファイルを準備する必要はありません。

もちろん
manage.py test
でエラーはでません。
ですが、windowsの環境でsettings.pyで
USE_I18N = True
となっていると
manage.py runserver
としたときに、gettextのワーニングがいろいろ出ます。
これを解消するには、
http://docs.djangoproject.com/en/dev/topics/i18n/#gettext-on-windows
から
gettext-runtime-0.17-1.zip
gettext-tools-0.17.zip
を取得して、それぞれを解凍して出来たディレクトリの中身を
C:\Program Files\gettext-utils
に入れます。
そして環境変数PATHに
C:\Program Files\gettext-utils\bin
を通すことでワーニングは解消されます。
単に設定を
USE_I18N = False
にするのでも差し支えはないとは思います。

これでDjangoのadmin画面とかが使えちゃえます。
かなり便利です。
デフォルトだと独自にadminアカウントを作って、そのアカウントでログインするようになっていますが、Google App Engineを使っているならば、そこいら辺はGoogleアカウントにお任せしたいところです。
その手段は、
http://code.google.com/p/app-engine-patch/wiki/GoogleAccounts
に書いてありました。

私は、以下のような感じにしてみました。
app.yamlに

- url: /admin/.*
script: common/appenginepatch/main.py
login: admin

として、
settings.pyのmiddlewareの部分を
'django.contrib.auth.middleware.AuthenticationMiddleware'
をコメントアウトして
'ragendja.auth.middleware.GoogleAuthenticationMiddleware'
を有効にします。
そして
AUTH_USER_MODULE = 'ragendja.auth.google_models'
AUTH_ADMIN_MODULE = 'ragendja.auth.google_admin'
も有効にします。
これで/adminにアクセスすればgoogleアカウントのログイン画面が表示されて、admin権限があるユーザのみが利用できるようになります。

そして自分が作ったアプリケーションのmodelをadminで利用するには以下のような感じです。
ここではアプリケーション名をahahaでmodels.pyにOhohoというクラスを作ったとします。
もちろんsettings.pyには記述済みというコトで。
Ohohoをadmin画面で管理できるようにするには、
ahahaディレクトリに以下のようなadmin.pyを作成します。

from ahaha.models import Ohoho
from django.contrib import admin

admin.site.register(Ohoho)

これだけです。

2009-06-27

Djangoのローカルテスト環境でGoogle map apiを利用する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google map APIを利用するには、サイトのurlが必要になります。

本番環境は、問題ないとしてローカルでテストしているときですが、Djangoの場合
http://localhost:8000
となっているわけです。

ここでテストするにはどうしたらよいかと思っていたら
普通にGoogle map APIのkeyの申請のところで
http://localhost:8000
と申請すればよいだけでした。

で、Google App EngineのDjango環境でためしに住所から緯度経度を取ってみるサンプルです。
まずsettings.pyに
MAP_KEY = 'xxxxxxxxx'
と定義しておきます。

適当なところで以下のような感じで

# -*- coding: utf-8; -*-

from django.conf import settings
import xml.etree.ElementTree as etree
from google.appengine.api import urlfetch
import urllib

def test_gmap():
url = 'http://maps.google.com/maps/geo?'
url = url + 'key=' + settings.MAP_KEY
url = url + '&sensor=false'
url = url + '&output=xml'
url = url + '&q=' + urllib.quote('千代田区丸の内1-9-1')
result = urlfetch.fetch(url)

if result.status_code == 200:
dom = etree.fromstring(result.content)
namespace ='http://earth.google.com/kml/2.0'
retunrn dom.findtext('.//{%s}coordinates' % namespace)


ちょっとはまったポイントとしては、日本語を利用するならばファイルの先頭に
# -*- coding: utf-8; -*-
を忘れずに。
manage.py startapp
で生成するviews.pyとかにはcodingが入っていないので入れ忘れていてエラーが出てちょっと考えちゃいました。

あと、xmlの解析に利用しているElementTreeについては、
http://python.matrix.jp/modules/ElementTree.html
が参考になります。

Djangoのsettings.pyに独自設定を定義する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Djangoの設定はsettings.pyにいろいろ書かれています。
なので自分が作成するアプリケーション用の設定も同じく書いておきたいわけです。
それは、
http://djangoproject.jp/doc/ja/1.0/topics/settings.html#topics-settings
にちゃんと書いてあるので、そこを見ればOKです。

要約すると
settings.pyには、普通にオリジナルの設定を他の既存のパラメータと同様な感じで定義できます。
例えば、
MY_CONF = 'test conf'
とか普通に書きます。

使うときですが、利用するファイルで
from django.conf import settings
として、
val = settings.MY_CONF
で利用できます。

2009-06-24

Djangoで携帯サイト向けサイトを作るためにuamobileを使う

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
pythonで携帯サイトを作るためには、uamobileが便利なわけです。
SOBARCOでもuamobileは使っているのですが、ちょっとバージョンが古く、今では結構変更されていました。

そして今度は、Djangoで利用できるようしてみたのでその手順です。

Djangoの環境作成は、ココをごらんください。

まずuamobileを以下から取得します。
http://pypi.python.org/pypi/uamobile/
今回は、0.2.5を利用しています。
取得したファイルを解凍してできたディレクトリにあるuamobileディレクトリをDjangoプロジェクトのルートディレクトリの直下にコピーします。

uamobileではIPyというのも使っているようなので取得します。
http://pypi.python.org/pypi/IPy
今回は、0.63を利用しています。
取得したファイルを解凍してできたディレクトリにあるIPy.pyをDjangoプロジェクトのルートディレクトリの直下にコピーします。

私の環境ではuamobile/cidr.pyの先頭をコメントアウトしないいけませんでした。
#from pkg_resources import resource_string


これで使う準備が整いました。

せっかくDjangoで利用するのでmiddlewareとしてどのページを見るときでも勝手にサイトを見ている端末を判別できるようにします。

Djangoプロジェクトの直下にcommonディレクトリを作成します。
commonディレクトリに内容が空の__init__.pyファイルを作ります。
また、以下のmiddleware.pyを作成します。
from uamobile import detect

class UserAgentMobileMiddleware(object):
def process_request(self, request):
request.device = detect(request.META)

こちらは、http://labs.unoh.net/2007/08/python_3.htmlを参考にさせていただきました。

そしてsetting.pyのMIDDLEWARE_CLASSESに
'common.middleware.UserAgentMobileMiddleware',
を追加します。

ちゃんと動いている確認します。
Dyangoプロジェクト直下で
python manage.py startapp myapp
を実行します。

そしてsetting.pyのINSTALLED_APPSにmyappを追加する。

myapp/view.pyを以下のように編集する。
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response

def index(request):
payload = dict()
payload['docomo'] = request.device.is_docomo()
payload['au'] = request.device.is_ezweb()
payload['softbank'] = request.device.is_softbank()
payload['pc'] = request.device.is_nonmobile()
return render_to_response('index.html', payload)


テンプレートも準備します。templates/index.htmlを以下のように編集します。
<html>
<head>
<title>test</title>
</head>
<body>
aaa<br>
docomo:{{docomo}}<br>
au:{{au}}<br>
sofubank:{{softbank}}<br>
pc:{{pc}}<br>
</body>
</html>


urls.pyを以下のように変更する。
urlpatterns = patterns('myapp.views',
(r'^$', 'index'),
)


ここまで準備できたらrunserverでhttp://localhost:8000/にいろんな端末でアクセスしてみることで端末判別が行われていることがわかります。
携帯サイトのテストには、FirefoxのアドオンであるFireMobileSimulatorがむちゃむちゃ便利です。

ちょっとまとめるとDjangoの環境とは別にここまで追加したものは以下のような感じです。
Djangoルート
|-uamobile
|-IPy.py
|-common
| |-__init__.py
| |-middleware.py
|-myapp
| |-views.py
|-templates
|-index.html

2009-06-19

Google App EngineのDjangoでチュートリアルをやってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App Engine上のDjangoは、使えるデータベースが特殊なため以下のDjangoのマニュアルにあるチュートリアルはそのままではできないようです。
http://djangoproject.jp/doc/ja/1.0/index.html

なのでGoogle App Engine上のDjangoでのチュートリアルが
http://webos-goodies.jp/archives/51337216.html
にあるので、こちらを参考にしたわけですがそのままでは動きませんでした。
私の作成した環境が
Google App EngineでDjangoを利用する
で紹介させていただいたように、Djangoは1.0.2を利用していて更にGoogle App Engine Helperを利用している環境のためだろうと思います。

というわけで私の環境で
http://webos-goodies.jp/archives/51337216.html
で紹介してあるチュートリアルを動くようするための変更点を紹介させていただきます。

まずhelperを入れているので
python manage.py startapp poll
の前まではすでに準備が出来ているので何もしません。

settings.pyのINSTALLED_APPSだけを以下のように変更します:

INSTALLED_APPS = (
'appengine_django',
'poll',
)


url.pyは、以下のように変更します。

from django.conf.urls.defaults import *

urlpatterns = patterns('poll.views',
(r'^$', 'index'),
(r'^create/$', 'create'),
(r'^poll/(?P[^\.^/]+)/$', 'poll_detail'),
(r'^poll/(?P[^\.^/]+)/results/$', 'poll_results'),
)


models.pyは紹介しているままです。

bforms.pyは、以下のようにします。
formsのimportとcleaned_dataの部分を修正しています。
このファイルは、pollディレクトリに作成します。

from django import forms
import models
from google.appengine.ext.db import djangoforms

class PollForm(djangoforms.ModelForm):
class Meta:
model = models.Poll
exclude = ['created_by']

class ChoiceForm(forms.Form):
choice = forms.CharField(max_length = 100)

def __init__(self, poll=None, *args, **kwargs):
self.poll = poll
super(ChoiceForm, self).__init__(*args, **kwargs)

def save(self):
choice = models.Choice(poll = self.poll, choice = self.cleaned_data['choice'])
choice.put()


views.pyは、
from pollango.poll import models
となっているものを
from poll import models
に直すだけです。

後は、http://webos-goodies.jp/archives/51337216.htmlに書いてある通りで動くようになりました。

2009-06-14

Google App EngineでDjangoを利用する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App Engine for javaを勉強しようかなぁと思っていましたが、気が変わりDjangoの方を勉強してみようと思い立ったのです。

ちなみに開発環境はwindowsです。

Google App Engineには、0.96.1のDnangoが
C:\Program Files\Google\google_appengine\lib\django
にあったりして、そのまま利用できるバージョンはこのバージョンのようですが、
最新は、1.0.2のようです。
なので、この1.0.2が利用できてeclipseで開発できる環境までを構築してみました。

pythonはインストール済みなのが前提です。

最初に、Djangoをインストールします。
http://www.djangoproject.com/download/
から
Django-1.0.2-final.tar.gz
を取得して解凍します。
コマンドプロンプトで解凍したディレクトリの中の
Django-1.0.2-finalのディレクトリに移動して
python setup.py install
を実行します。

更にこのディレクトリ内のdjangoディレクトリをzip圧縮したdjango.zipを作っておきます。

Djangoが正しくインストールできたことを確認するためにコマンドプロンプトで
C:\Python25\Lib\site-packages\django\bin\django-admin.py --version
(PythonがPython25にインストールされている場合です)
を実行して
1.0.2 final
と表示されることを確認します。

Google App EngineをDjangoを利用するには、
Google App Engine Helperを利用すると便利なようなので利用します。
http://code.google.com/p/google-app-engine-django/downloads/detail?name=appengine_helper_for_django-r86.zip&can=2&q=
から
appengine_helper_for_django-r86.zip
を取得して解凍します。

Djangoでは、プロジェクトという単位が一番大きな管理単位のようです。
そのプロジェクトを作成します。
ここではC:\temp\pythonとします。
プロジェクトのためのディレクトリを作成します。
ここでは
test_django
とします。

このディレクトリに
helperのzipを解凍してできたディレクトリの中身をコピーします。
また、このディレクトリを事前に作っておいたzip圧縮して作成したdjango.zipもコピーします。

helperをwindowsで利用するには、
http://sourceforge.net/projects/pywin32
にある
pywin32-212.win32-py2.5.exe
を取得してインストールしておく必要があるようです。
(参考:http://code.google.com/intl/ja/appengine/articles/appengine_helper_for_django.html

helperが動作することを確認します。
コマンドプロンプトでDjangoプロジェクトのディレクトリに移動します。
cd C:\temp\python\test_django
Djangoのサーバーを起動します。
python manage.py runserver
そして
http://localhost:8000
にアクセスしてDjangoのページが表示されることを確認します。
また、
http://localhost:8000/_ah/admin
で、Google App Engineのadminページも利用できることも確認します。

ここまでの内容は、
http://code.google.com/intl/ja/appengine/articles/appengine_helper_for_django.html
http://mars.shehas.net/~tmatsuo/misc/appengine_helper_for_django-ja.html
が参考になります。

次にeclipseで作成したDjangoプロジェクトを開発できるようにします。
私はEclipseは3.3を利用しています。
そしてPythonが開発できるためのPydevはインストール済みのものとします。

eclipseを起動して
「ファイル」-「新規」-「プロジェクト」を選択
「Pydevプロジェクト」を選んで「次へ」
djangoプロジェクトを作成したディレクトリを
プロジェクト・コンテンツのディレクトリーに指定
(ここではC:\temp\python\test_django)
プロジェクト名を作成したdjangoプロジェクトと同じにする
(ここではtest_django)
デフォルトのsrc・・・のチェックをはずす
そして「完了」
これでeclipseでDjangoプロジェクトが見れるようになります。

次に、manage.pyでrunserverが動作するようにします。

作成されたプロジェクト名を右クリック
「プロパティ」を選択
「Pydev」-「PYTHONPATH」-「Project source folder」-「ソースフォルダの追加」
でプロジェクトのディレクトリを指定する
(ここではtest_django)

manage.pyを右クリックして
「実行」-「実行ダイアログを開く」
「Python実行」を右クリックして「新規」を選択
 「プロジェクト」にdjangoプロジェクトを選ぶ(ここではtest_django)
 「メイン・モジュール」にmanage.pyを選ぶ
「引数タブ」をクリックして
 「program argument」にrunserverを記述し
 「作業ディレクトリ」-「その他」を選択してワークスペースをクリックしてプロジェクトのルートを選択する(ここではtest_django)
そして「実行」をクリックするとhttp://localhost:8000で最初に確認したdjangoのページが見れるようになります。

ちなみに
python.exe manage.py startapp polls
のようにプロジェクトの下に新しいファイルをコマンドプロンプトで追加した場合、
eclipse上でプロジェクトを右クリックして「更新」をすると新しく作成されたファイルが見えるようになります。

こんな感じでは、まずは開発環境を作ってみました。


*最初は、0.96.1でやろうとしましたが、helperの最新版では1.0以上が必要で、更に0.96に対応しているr52では、Google App Engineのバージョンが新しいとなんかうまく使えなかったので使うのをやめました。新しいVersionが使えることに越したことはないですしね。