ちょっと webapp 以外も触ってみたいなーと思ってとりあえず django を動かしてみた。
参考にしたサイトの情報は多少古い(Django0.96時代のもの)なので日本語訳にするついでに新しいバージョン(Django1.1)に対応してみた。といっても基本はあまり変わらないんですけど。
元エントリは Django on Google App Engine in 13 simple steps : Thomas Brox Røst です。英語むずかしい。
また、django1.1 対応するにあたり Google AppEngine で Django 1.1 を使う | METAREAL を参考にしました。ありがとうございます。
Step 1: SDKをインストールして、アプリケーションの名前を登録します。
SDKをインストール後、django1.1をインストールします。SDK自体にはdjango0.96しか入っていないので手動でインストールする必要があります。また、Google App Engine のサーバにはすでにインストールされているので、ユーザがdjangoをアップロードする必要はありません。
Step 2: ディレクトリを作成します。このチュートリアルでは djangotest という名前にします。
tmp$ mkdir djangotest
tmp$ cd djangotest
Step 3: main.py を新しく作成したディレクトリ内に作ります。
# main.py
import os, sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'djangotest.settings'
sys.path.append('/home/brox/tmp/djangotest')
from google.appengine.dist import use_library
use_library('django', '1.1')
# Google App Engine imports.
from google.appengine.ext.webapp import util
# Force Django to reload its settings.
from django.conf import settings
settings._target = None
import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch
sig = django.dispatch.Signal()
# Log errors.
#sig.connect(log_exception, django.core.signals.got_request_exception)
# Unregister the rollback event handler.
sig.disconnect(
django.db._rollback_on_exception,
django.core.signals.got_request_exception)
def main():
# Create a Django application for WSGI.
application = django.core.handlers.wsgi.WSGIHandler()
# Run the WSGI CGI handler with that application.
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
これはローカルでテストする為にパスを追加した部分を除いて、ここにあるファイルとほぼ同じです。
そして DJANGO_SETTINGS_MODULE を追加しましたが App Enginne で動かす分にはきっと必要ないでしょう。
動かないエラーログを無効にする必要がありました。(よくわかりません><)
Step 4: app.yaml を同じディレクトリに追加します。内容は以下の通り。
application: djangotest
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
script: main.py
アプリケーション名を確認しましょう。
Step 5: djangotest ディレクトリから、新しい Django プロジェクトを作成します。
tmp/djangotest$ django-admin.py startproject djangotest
(Django は正しくインストールされているものとします)
Step 6: 作成したアプリケーションを確認します。
tmp/djangotest$ cd ..
tmp$ dev_appserver.py djangotest
INFO 2008-04-08 19:08:10,023 appcfg.py] Checking for updates to the SDK.
INFO 2008-04-08 19:08:10,384 appcfg.py] The SDK is up to date.
INFO 2008-04-08 19:08:10,404 dev_appserver_main.py] Running application mash
name on port 8080: http://localhost:8080
ブラウザで http://127.0.0.1:8080/ にアクセスし、 It worked! のメッセージがでる事を確認します。
Step 7: 新しい django アプリをこのプロジェクト内に作成します。
tmp$ cd djangotest
tmp/djangotest$ python djangotest/manage.py startapp main
Step 8: まずmodelを追加します。今から作る物は訪問者のIPアドレスおよびアクセス時間ログを取り、出力するだけの簡単なアプリケーションです。
# models.py
from google.appengine.ext import db
class Visitor(db.Model):
ip = db.StringProperty()
added_on = db.DateTimeProperty(auto_now_add=True)
標準のDjangoモデルを使用する必要はありません。
Step 9: view を作ります。データをVisitorモデルに追加し、以前の訪問者を表示します。models.py と同じディレクトリにある views.py を編集します。
# views.py
from django.http import HttpResponse
from djangotest.main.models import Visitor
def main(request):
visitor = Visitor()
visitor.ip = request.META['REMOTE_ADDR']
visitor.put()
result = ''
visitors = Visitor.all()
visitors.order('-added_on')
for visitor in visitors.fetch(limit=40):
result += visitor.ip + u' visited on ' + unicode(visitor.added_on) + u''
return HttpResponse(result)
Step 10: 最後に、urls.py を編集します。
# urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^$', 'djangotest.main.views.main'),
)
Step 11: Step6と同様にアプリケーションをテストします。上手く動けば、リロードする都度新しいVisitorの情報が追加され、それらを表示します。
Step 12: アプリケーションを Google App Engine へアップロードします。
tmp$ appcfg.py update djangotest
最初のアップロード時にグーグルアカウントのメールアドレスとパスワードを求められるでしょう。
Step 13: http://djangotest.appspot.com にアクセスして動いているか確認します。