4. 管理用スクリプト

4.1. 概要

Kay には manage.py という管理用のスクリプトが付いています。このスクリプトで、アプリケーション管理タスクの大部分をカバーできます。パラメーター無しで呼出せばヘルプを見る事ができます。

タスクの一部は、Google App Engine SDK が提供するコマンドを実行しますが、実行の際にパラメータの調整や、事前準備を行います。

ですので、GAE 附属のスクリプト( appcfg.py や dev_appserver.py または bulkloader.py )をそのまま使用する事はなるべく避けてください。

4.2. manage.py add_translations

指定したアプリケーションに新しい言語カタログを追加します。

$ python manage.py add_translations [options]
-t, --target string
対象となるディレクトリを指定します。
-a
指定すると全てのアプリケーションが対象になります。
-l lang
言語コードを指定します。例) ja
-f
指定すると、既存のカタログがあっても上書きされます。

4.3. manage.py appcfg

このサブコマンドは 素のGAE で appcfg.py にて行うタスクを実行するためのものです。appcfg サブコマンドの使用方法は下記のとおりです:

$ python manage.py appcfg [options] <action>

action は下記のどれかである必要があります:

  • cron_info: cron ジョブの情報を表示します。
  • download_data: データストアからデータをダウンロードします。
  • help: あるアクションのヘルプを表示します。
  • request_logs: Apache の common log フォーマットでログを書き出します。
  • rollback: 実行途中のアップデートをロールバックします。
  • update: アプリケーションをアップロードします。
  • update_cron: アプリケーションの cron 設定を更新します。
  • update_indexes: アプリケーションの index を更新します。
  • update_queues: アプリケーションのタスクキュー設定を更新します。
  • upload_data: データストアにデータをアップロードします。
  • vacuum_indexes: アプリケーションで使用しない index を削除します。

help アクションに続いてアクション名を指定する事で、特定のアクションに対するヘルプを表示できます。例えば、下記のように実行すれば update アクションのヘルプが得られます:

$ python manage.py appcfg help update

Kay は引数にカレントディレクトリを自動的に補完します。ですので、各アクションのヘルプにあるようにアプリケーションディレクトリを指定する必要はありません(この動作はちょっと紛らわしいので将来は修正されるかもしれません)。例えばアプリケーションをアップロードするには下記のコマンドでオッケイです:

$ python manage.py appcfg update

現バージョンの Kay は、GAE のサーバ上では事前パースされた jinja2 テンプレートのみ読み込みますので、デプロイの前にテンプレートの事前パースが必要です。manage.py スクリプトは自動的に事前パースを行いますので、普段ユーザーはこの事を気にする必要はありません。もし、MacOSX のランチャーを使っている場合には deploy ボタンを押すだけでは jinja2 テンプレートの事前パースは行われません。このような場合は、 manage.py preparse_apps のようにすればテンプレートの事前パースを行う事ができます。

4.4. manage.py bulkloader

適切なパラメータを指定して、バルクローダ・スクリプトを実行します。

$ python manage.py bulkloader [option]
--help
ヘルプを表示します

4.5. manage.py clear_datastore

リモートAPIを使用して、App Engine上のデータを全て消去します。

$ python manage.py clear_datastore
-a, --appid appid
対象となるアプリケーションを appid で指定します。指定が無ければ app.yaml 内の application に設定された値が使用されます。
-h, --host host
対象となるアプリケーションをホスト名で指定します。デフォルト値は appid.appspot.com です。
-p, --path path
リモートAPIのパスを指定します。デフォルト値は /remote_api です。
-k, --kinds string
削除するエンティティの kind を指定します。kind はデフォルトでは appname_model となっています。指定が無ければ全てのモデルが対象になります。
-c, --clear-memcache
memcacheのデータもすべて削除します。
--no-secure
HTTPSを使用せずに通信します。

4.6. manage.py compile_translations

アプリケーションの全ての国際化カタログをコンパイルします。

$ python manage.py compile_translations
-t, --target string
対象となるディレクトリを指定します。
-a, --all
指定すると全てのアプリケーションが対象になります。

4.7. manage.py create_user

リモートAPIを使用して、ユーザを新規作成します。

$ python manage.py create_user
-u, --user-name username
ユーザ名を指定します。
-P, --password password
パスワードを指定します。
-A, --is-admin
管理者権限を付与する場合に指定します。
-a, --appid appid
対象となるアプリケーションを appid で指定します。デフォルト値は settings.pyAPPLICATION_ID です。
-h, --host host
対象となるアプリケーションをホスト名で指定します。デフォルト値は appid.appspot.com です。
-p, --path path
リモートAPIのパスを指定します。デフォルト値は /remote_api です。
--no-secure
HTTPSを使用せずに通信します。

4.8. manage.py dump_all

すべてのデータをサーバからダンプします。

--help
ヘルプを表示します。
-n, --data-set-name string
_backup 配下に、ここで指定した名称のディレクトリが生成され、データとログファイルが保存されます。
-i, --app-id appid
データをダンプするアプリケーションを appid で指定します。
-u, --url url
データをダンプするアプリケーションをURLで指定します。
-d, --directory directory
データをダンプするディレクトリを指定します。

4.9. manage.py extract_messages

国際化対象のメッセージを抽出して、potファイルを生成します。

$ python manage.py extract_messages [options]
-t, --target directory
対象となるディレクトリを指定します。
-a, --all
指定すると全てのアプリケーションが対象になります。
-d, --domain domain
  • messages を指定すると、Pythonスクリプトと templates 配下のテンプレートファイルが対象となります。
  • jsmessages を指定すると、JavaScriptファイルが対象となります。

4.10. manage.py preparse_apps

このコマンドは、 settings.INSTALLED_APPS の設定値に基いて、全ての jinja2 テンプレートを事前パースします。manage.py を使用してアプリケーションをアップロードする時、自動的にこの処理が行われるので、普段は実行する必要はありません。

$ python manage.py preparse_apps

4.11. manage.py preparse_bundle

Kay自身の Jinja2 テンプレートを事前パースします。Kayの開発者が使用するコマンドです。

$ python manage.py preparse_bundle

4.12. manage.py restore_all

すべてのデータをサーバにリストアします。

$ python manage.py restore_all [options]
--help
ヘルプを表示します。
-n, --data-set-name datasetname
_backup 配下の、ここで指定した名称のディレクトリに保存されているデータをサーバにリストアします。
-i, --app-id appid
データをリストアするアプリケーションを appid で指定します。
-u, --url url
データをリストアするアプリケーションをURLで指定します。
-d, --directory directory
リストアするデータの保存されたディレクトリを指定します。

4.13. manage.py rshell

運用サーバのデータストアにアクセスする対話型のシェルを起動します。

$ python manage.py rshell [options]
-a, --appid appid
appid を指定します。
-h, --host host
対象となるアプリケーションをホスト名で指定します。デフォルト値は appid.appspot.com です。
-p, --path path
リモートAPIのパスを指定します。デフォルト値は /remote_api です。
--no-useful-imports
自動インポートを解除して起動します。アプリケーション配下のモデル定義がインポートされなくなります。
--no-secure
HTTPSを使用せずに通信します。
--no-use-ipython
iPythonを使わずに通常の対話型シェルを起動します。

4.14. manage.py runserver

適切なパラメータを指定して、dev_appserverを起動します。

$ python manage.py runserver [options]
--help
ヘルプを表示します

4.15. manage.py shell

Pythonの対話型プロンプトを起動します。

$ python manage.py shell [options]
--datastore-path path
データストアのパスを指定します。
--history-path path
クエリの履歴ファイルのパスを指定します。
--no-useful-imports
自動インポートを解除して起動します。アプリケーション配下のモデル定義がインポートされなくなります。
--no-use-ipython
iPythonを使わずに標準の対話型プロンプトを起動します。

4.16. manage.py startapp

新しいアプリケーションを作成します。

$ python manage.py startapp myapp

4.17. manage.py startproject

新しいプロジェクトを作成します。

$ python manage.py startproject myproject
--proj-name projectname
プロジェクト名を指定します。

4.18. manage.py test

インストールされたアプリケーションのテストを実行します。

$ python manage.py test [options]
--target APP_DIR
対象となるアプリケーションのディレクトリを指定します。
-v, --verbosity integer

メッセージの出力レベルを整数で指定します。デフォルト値は 0 です。

  • 0: 出力なし。
  • 1: 進捗を . で出力。
  • 2: テストメソッドの docstring を出力。
--high-replication
指定するとテストを HRD エミュレーション環境で実施します。

4.19. manage.py update_translations

potファイルで翻訳ファイルを更新します。

$ python manage.py update_translations [options]
-t, --target directory
対象となるディレクトリを指定します。
-a
指定すると全てのアプリケーションが対象になります。
-l, --lang lang
翻訳する言語を指定します。例) -l ja
-s, --statistics
翻訳の完成度合いを出力します。

4.20. 独自の management script を追加する

アプリケーションディレクトリ内に management モジュールを置き、その 中に action_ で始まる関数(例: action_foo, action_bar)を定義すること で、独自の管理スクリプトを追加できます。関数の後半部分が manage.py から使用するサブコマンドの名前になります。例えば action_foo を追加 したなら、この関数を python manage.py foo で呼出せます。

4.20.1. 簡単な例

foo サブコマンドをプロジェクトに追加する簡単な例を見てみましょう。

myapp/management.py

def action_foo(foo_arg=("f", ""), use_bar=True):
  print"foo_arg: %s" % foo_arg
  print"use_bar: %s" % use_bar

この例で foo_arg はシェル上で --foo-arg <値> とするか -f <値 > とする事で指定できます。 use_bar の値はデフォルトで True ですが False で上書きするには --no-use-bar と指定します。

この管理スクリプトの仕組みは werkzeug の機能をベースにしています。です ので werkzeug documentation を参照す るとより深く動きを理解する事ができるでしょう。

4.20.2. 管理スクリプトを作成するためのヘルパー関数

kay.management.utils.create_db_manage_script(main_func=None, clean_func=None, description=None)

これは開発サーバー及び本番サーバーのデータストアにアクセスするための 管理スクリプトを作成するためのヘルパー関数です。

パラメタ:
  • main_func – メインの動作を関数を渡す事により指定します
  • clean_func – -c 又は –clean が指定された時にメインの関数より前に実行する関数を渡します。
  • description – サブコマンドの説明を指定します。

簡単な例を見てみましょう。

myapp/management.py:

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

from google.appengine.ext import db

from kay.management.utils import (
  print_status, create_db_manage_script
)
from myapp.models import Prefecture

prefectures = {
  1: u'Hokkaido',
  2: u'Aomori',
  3: u'Iwate',
  # ..
  # ..
}

def create_prefectures():
  entities = []
  for idnum, name in prefectures.iteritems():
    entities.append(
      Prefecture(name=name,
                 key=db.Key.from_path(Prefecture.kind(), idnum)))
  db.put(entities)
  print_status("Created prefectures.")

def delete_prefectures():
  db.delete(Prefecture.all().fetch(100))
  print_status("Deleted prefectures.")

action_create_prefectures = create_db_manage_script(
  main_func=create_prefectures, clean_func=delete_prefectures,
  description="Create Prefectures")

このサブコマンドは python manage.py create_prefectures で実行できま す。有効なパラメーターは下記の通りです。

$ python manage.py create_prefectures
-a <appid>, --appid <appid>
対象となるアプリケーションを appid で指定します。指定が無ければ app.yaml 内の application に設定された値が使用されます。
-h <host>, --host <host>
対象となるアプリケーションをホスト名で指定します。デフォルト値は appid.appspot.com です。
-p <path>, --path <path>
リモートAPIのパスを指定します。デフォルト値は /remote_api です。
--no-secure
HTTPSを使用せずに通信します。
-c, --clean
データ作成の前にデータを一度全部削除します。

下記のようにすれば、このサブコマンドを開発サーバーに対して実行する事が できます。

$ python manage.py create_prefectures -h localhost:8080 --no-secure