GAE+Django+GAEUnit (Part-I)
Google App Engine Python SDKにDjango(0.96)が付いてくるのは知っていたけど、普段はPylonsを使うことが多いのであまり気にかけないでいた。でも今回GAEでちょっとしたアプリケーションを開発していて、webappフレームワークでは色々無理がでると実感したので、Djangoを使うことを決心。以下、要点のまとめ。今回珍しくWindows XPで開発してます(笑
準備
プロジェクト設置(GAE)
- Google App Engine Launcher使えばおじさんにも一発でできる(笑
- ま、空のディレクトリ作ってそこにapp.yamlとか置いてもよかろう。
→gaetestというディレクトリを作った。
gaeunit.py
- gae-unit 1.2.8を持ってきて解凍。
- gaeunit.pyと、sampleapp中のtestおよびwebtestディレクトリをコピーしてくる。
- ディレクトリ構造はこんな感じになる。
-+gaetest +-app.yaml +-index.yaml +-main.py +-gaetest +-__init__.py +-manage.py +-settings.py +-urls.py +-gaeunit.py +-webtest +-__init__.py +-debugapp.py +-test +-unit_tests.py +-web_tests.py
main.py
- GAE Launcherが作った雛形はwebapp前提なので、中身を下記に入れ替える。
import logging, os # 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 # Must set this env var before importing any part of Django # 'project' is the name of the project created with django-admin.py os.environ['DJANGO_SETTINGS_MODULE'] = 'gaetest.settings' #←django-admin.pyで作ったプロジェクト名.settings import logging import django.core.handlers.wsgi import django.core.signals import django.db import django.dispatch.dispatcher def log_exception(*args, **kwds): logging.exception('Exception in request:') # Log errors. django.dispatch.dispatcher.connect( log_exception, django.core.signals.got_request_exception) # Unregister the rollback event handler. django.dispatch.dispatcher.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()
app.yaml
application: gaetest version: 1 runtime: python api_version: 1 handlers: - url: /test.* script: gaeunit.py - url: /.* script: main.py
settings.py
- Databaseは使わないので全部空白に。
- 認証関係もDatabaseを参照するのでコメントアウト。
- Templateの場所を明示
# Django settings for gaetest project. import os DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = ( # ('Your Name', 'your_email@domain.com'), ) MANAGERS = ADMINS DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'. DATABASE_NAME = '' # Or path to database file if using sqlite3. DATABASE_USER = '' # Not used with sqlite3. DATABASE_PASSWORD = '' # Not used with sqlite3. DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. # Local time zone for this installation. Choices can be found here: # http://www.postgresql.org/docs/8.1/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE # although not all variations may be possible on all operating systems. # If running in a Windows environment this must be set to the same as your # system time zone. TIME_ZONE = 'America/Chicago' # Language code for this installation. All choices can be found here: # http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes # http://blogs.law.harvard.edu/tech/stories/storyReader$15 LANGUAGE_CODE = 'en-us' SITE_ID = 1 # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = True # Absolute path to the directory that holds media. # Example: "/home/media/media.lawrence.com/" MEDIA_ROOT = '' # URL that handles the media served from MEDIA_ROOT. # Example: "http://media.lawrence.com" MEDIA_URL = '' # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a # trailing slash. # Examples: "http://foo.com/media/", "/media/". ADMIN_MEDIA_PREFIX = '/media/' # Make this unique, and don't share it with anybody. SECRET_KEY = 'qexhr1ju9r*r3x7g+et*rnvl#g448z7(!bd_vcdsjz#x-_gylk' # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source', # 'django.template.loaders.eggs.load_template_source', ) MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', # 'django.contrib.sessions.middleware.SessionMiddleware', # 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.doc.XViewMiddleware', ) ROOT_URLCONF = 'gaetest.urls' TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ) INSTALLED_APPS = ( # 'django.contrib.auth', 'django.contrib.contenttypes', # 'django.contrib.sessions', 'django.contrib.sites', ) ROOT_PATH = os.path.dirname(__file__) TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or # "C:/www/django/templates". Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ROOT_PATH + '/templates', )
→この時点でLauncherからアプリケーションを起動し、ブラウザでhttp://localhost:8080/ (ポート番号はLauncherに表示されてるのを指定)につなぐと、Djangoが動いていることがわかる。
さて、ここで準備完了。ここからやっとGAEUnitを使ったTDDに入れる。長いので一旦切ります。(つづく