ローカル開発用サーバーの使用

ローカル開発用サーバーを使用すると、本番環境での App Engine アプリケーションの実行をシミュレートしながら、App Engine バンドル サービスにアクセスできます。

シミュレートされた環境では、システム関数や Python 2 モジュールによるインポート機能の制限など、サンドボックスにある程度制限がありますが、リクエストのタイムアウトや割り当てには制限がありません。

App Engine 用 SDK のライブラリによって提供される Datastore、Memcache、タスクキューなどのサービスを、ローカル開発用サーバーでローカルに実行してシミュレートすることもできます。アプリケーションが開発用サーバーで動作している場合でも、Google API の HTTP エンドポイントを使用して、本番環境のインフラストラクチャに対するリモート API 呼び出しを実行できます。

始める前に

Python 2.7 はサポートが終了しているため、dev_appserver.py の最新バージョンを使用してアプリケーションをローカルで実行することはできません。devapp_server.py のアーカイブ バージョンをダウンロードする手順は次のとおりです。

  1. アーカイブから、サポートが終了したランタイム用の dev_appserver.py サーバーを含む圧縮フォルダをダウンロードします。

  2. ディレクトリの内容をローカル ファイル システム(/home ディレクトリなど)に抽出します。dev_appserver.pygoogle_appengine/ ディレクトリにあります。

ローカル開発用サーバーをセットアップする

ローカル開発用サーバーツールを実行するには、次の設定を行う必要があります。

  1. バージョン 2.7.12 以降の Python 2 インタープリタがインストールされていることを確認します。

  2. シェル内の DEVAPPSERVER_ROOT 環境変数を Python 2 インタープリタのパスに設定します。

ローカル開発用サーバーの実行

ローカル開発用サーバーを設定し、アプリの app.yaml 構成ファイルを作成した後、dev_appserver.py コマンドを使用すると、アプリをローカルで実行できます。

ローカル開発用サーバーを起動するには:

  1. app.yaml 構成ファイルが格納されているディレクトリで dev_appserver.py コマンドを実行します。

    アプリへのディレクトリ パスを指定します。たとえば次のようにします。

         python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py [PATH_TO_YOUR_APP]
    

    また、特定のサービスの構成ファイルを指定することもできます。たとえば次のようにします。

         python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py app.yaml
    

    ポートを変更する場合は、--port オプションを含めます。

         python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --port=9999 [PATH_TO_YOUR_APP]
    

    [DEVAPPSERVER_ROOT] は、devapp_server.pyアーカイブ バージョンを抽出するフォルダのパスに置き換えます。

    dev_appserver.py コマンド オプションについて詳しくは、ローカル開発用サーバーのオプションをご覧ください。

  2. ローカル開発用サーバーが起動し、リクエストを待機します。ウェブブラウザで http://localhost:8080/ にアクセスすると、アプリの動作を確認できます。

    --port オプションでカスタムポートを指定した場合は、そのポートでブラウザを開くようにしてください。

ローカル サーバーをコマンドラインから停止するには、次のキーを押します。

  • macOS または Linux: Control+C
  • Windows: Ctrl+Break

アプリケーション ID を指定する

メールアドレスのなりすましなどのために、ローカル サーバーでアプリ ID にアクセスする必要がある場合は、get_application_id() 関数を使用します。実行中のアプリのホスト名を取得するには、get_default_version_hostname() 関数を使用します。

アプリケーションのランタイム環境の検出

コードが本番環境またはローカルの開発用サーバーのどちらで実行されているかを確認するには、SERVER_SOFTWARE 環境変数の値を調べます。

if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
  # Production
else:
  # Local development server

ローカル Datastore の使用

ローカル開発用サーバーは、ローカル サーバーの呼び出し間で持続するローカル ファイルを使用して App Engine Datastore をシミュレートします。

インデックスと index.yaml の詳細については、Datastore インデックス ページと Datastore インデックスの構成ページをご覧ください。

ローカル Datastore を参照する

ローカル開発用サーバーを使用してアプリがローカル Datastore にデータを書き込んでいる場合は、ローカル開発用コンソールでそのデータを参照できます。

ローカル Datastore を参照するには:

  1. 開発用サーバーを起動します

  2. ローカル開発用コンソールで Datastore Viewer にアクセスしますURL: http://localhost:8000/datastore

  3. ローカル Datastore のコンテンツを参照します。

ID 割り当てポリシーの指定

本番環境の App Engine の場合、エンティティ ID を自動的に生成するように Datastore を設定できます。

本番環境用サーバーの自動 ID 割り当てポリシーは、開発用サーバーで使用されるポリシーとは完全に異なりますが、ローカル サーバー用に自動 ID 割り当てポリシーを設定することもできます。

自動 ID 割り当てポリシーを指定するには、--auto_id_policy オプションを使用します。

python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --auto_id_policy=sequential

次のように置き換えます。

  • DEVAPPSERVER_ROOT は、devapp_server.pyアーカイブ バージョンを抽出するフォルダのパスに置き換えます。

  • --auto_id_policy は、次のいずれかに置き換えます。

    • scattered: (デフォルト)ID をほぼ均一に分布する整数の繰り返しのないシーケンスから割り当てる場合。
    • sequential: ID を連続する整数のシーケンスから割り当てる場合。

ローカル Datastore をクリアする

アプリケーション用のローカル Datastore をクリアするには、ローカル開発用サーバーを次のように呼び出します。

python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --clear_datastore=yes app.yaml

DEVAPPSERVER_ROOT は、devapp_server.pyアーカイブ バージョンを抽出するフォルダのパスに置き換えます。

ローカル Datastore の場所を変更する

Datastore ファイルの場所を変更するには、--datastore_path オプションを使用します。

python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --datastore_path=/tmp/myapp_datastore app.yaml

DEVAPPSERVER_ROOT は、devapp_server.pyアーカイブ バージョンを抽出するフォルダのパスに置き換えます。

ユーザー サービスを使用する

App Engine には、アプリケーションの認証と認可を簡素化するためのユーザー サービスが用意されています。ローカル開発用サーバーは、独自のログインページとログアウト ページで Google アカウントの動作をシミュレートします。ローカル開発用サーバーでの実行中、users.create_login_url 関数と users.create_logout_url 関数は、ローカル サーバー上の /_ah/login/_ah/logout の URL を返します。

メールを使用する

ローカル開発用サーバーは、SMTP サーバーまたはローカルにインストールされた Sendmail を使用して、呼び出しのメールを App Engine のメールサービスに送信できます。

SMTP の使用

SMTP サーバーを使用してメールサポートを有効にするには、次のように dev_appserver.py を呼び出します。

   python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --smtp_host=smtp.example.com --smtp_port=25 \
    --smtp_user=ajohnson --smtp_password=k1tt3ns [PATH_TO_YOUR_APP]

次のように置き換えます。

  • [DEVAPPSERVER_ROOT] は、devapp_server.pyアーカイブ バージョンを解凍するフォルダのパスに置き換えます。
  • --smtp_host--smtp_port--smtp_user--smtp_password の各オプションを実際の構成値に置き換えます。

Sendmail の使用

Sendmail でメールサポートを有効にするには、次のように dev_appserver.py を呼び出します。

   python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --enable_sendmail=yes [PATH_TO_YOUR_APP]

[DEVAPPSERVER_ROOT] は、devapp_server.pyアーカイブ バージョンを抽出するフォルダのパスに置き換えます。

ローカル サーバーは sendmail コマンドを使用し、インストールのデフォルト構成に従ってメールのメッセージを送信します。

URL 取得を使用する

アプリケーションが URL 取得 API を使用して HTTP リクエストを送信する場合、ローカル開発用サーバーはデベロッパーのコンピュータからリクエストを直接送信します。プロキシ サーバーを使用してウェブサイトにアクセスしている場合、ローカル サーバーでの URL 取得の動作は本番環境の App Engine と異なることがあります。

インタラクティブ コンソールを使用する

インタラクティブ コンソールを使用すると、デベロッパーはウェブフォームに任意の Python コードを入力し、アプリの環境内で実行できます。これは、アプリ自体の内部にある .py ファイルと同様に、アプリケーションの環境とサービスに対するアクセスを提供します。

インタラクティブ コンソールを使用するには:

  1. 開発用サーバーを起動します

  2. ローカル開発用コンソールでインタラクティブ コンソールにアクセスします。URL: http://localhost:8000/console

  3. テキスト ボックスに実行する必要のある任意の Python コードを入力し、フォームを送信して実行します。たとえば、次のコードは、Hello のテキスト コンテンツを含む Greeting というデータストア エンティティを追加します。

      from google.appengine.ext import ndb
      class Greeting(ndb.Model):
        content = ndb.TextProperty()
    
      e = Greeting(content="Hello")
      e.put()
    

Python デバッガでデバッグする

Python デバッガ(pdbを使用するには:

  1. コードに次の行を追加します。

    import pdb; pdb.set_trace();
    

    dev_appserver は、この時点で中断され、pdb REPL(読み取り - 評価 - 出力のループ)に入ります。これにより、コマンドラインからコードをデバッグできます。

  2. アプリケーションが pdb.set_trace() を呼び出す複数のリクエストを同時に送信すると、複数のデバッグ セッションが同時に開始され、それぞれが STDOUT に対して出力を送信します。これを防ぐには、次のように dev_appserver のマルチスレッドとマルチ処理のサポートを無効にして、リクエストをシリアル化します。

    1. 次のマルチスレッドを無効にします。

      • --threadsafe_override=false フラグを使用するすべてのサービス。
      • --threadsafe_override=<SERVICENAME>:false フラグを使用する 1 つのサービス。
      • --threadsafe_override=<SERVICE1NAME>:false,<SERVICE2NAME>:false フラグを使用する複数のサービス。
    2. 次のマルチ処理を無効にします。

      • --max_module_instances=1 フラグを使用するすべてのサービス。
      • --max_module_instances=<SERVICENAME>:1 フラグを使用する 1 つのサービス。
      • --max_module_instances=<SERVICE1NAME>:1,<SERVICE2NAME>:1 フラグを使用する複数のサービス。