Python 2 は、コミュニティでサポートを終了しました。Python 2 アプリを Python 3 に移行することをおすすめします。

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

Cloud SDKPython 2 用 App Engine SDK には、本番環境の App Engine で動作しているアプリケーションをシミュレートするために、ローカルで実行できるローカル開発用サーバー(dev_appserver.py)が同梱されています。このシミュレーション環境では、システム関数や Python 2 モジュールによるインポートが制限されるなど、サンドボックスにある程度の制限がありますが、リクエストのタイムアウトや割り当てには制限がありません。

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

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

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

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

  1. アプリの app.yaml 構成ファイルを含むディレクトリから、次のように dev_appserver.py コマンドを実行します。

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

    dev_appserver.py [PATH_TO_YOUR_APP]

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

    dev_appserver.py app.yaml

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

    dev_appserver.py --port=9999 [PATH_TO_YOUR_APP]

    dev_appserver.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 データストアをシミュレートします。

インデックスと 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 オプションを使用します。

dev_appserver.py --auto_id_policy=sequential

ここで、--auto_id_policy には次のいずれか 1 つを指定できます。

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

ローカル Datastore のクリア

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

dev_appserver.py --clear_datastore=yes app.yaml

ローカル Datastore の場所変更

データストア ファイルの場所を変更するには、--datastore_path オプションを使用します。

dev_appserver.py --datastore_path=/tmp/myapp_datastore app.yaml

Users サービスの使用

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 を呼び出します。

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

ここで、--smtp_host--smtp_port--smtp_user--smtp_password の各オプションに実際の値を設定します。

Sendmail の使用

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

dev_appserver.py --enable_sendmail=yes [PATH_TO_YOUR_APP]

ローカル サーバーは 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()
    

PDB を使用したデバッグ

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