認証済みユーザーのデータのパーソナライズ

リージョン ID

REGION_ID は、アプリを作成するときに選択するリージョンに基づいて Google が割り当てるコードです。既存のアプリでは省略可能でしたが、新しいアプリでは App Engine の URL に REGION_ID.r を含めることが必須になります。

移行がスムーズに行われるように、リージョン ID を使用するよう App Engine を徐々に更新しています。Google Cloud プロジェクトがまだ更新されていない場合、アプリにリージョン ID が表示されません。ID は既存のアプリでは省略可能なため、リージョン ID が既存のアプリで使用可能になったときに、URL を更新する、またはその他の変更を行う必要はありません。

詳しくは、リージョン ID をご覧ください。

認証済みユーザー情報を使用して、ユーザー固有のデータを保存および取得し、カスタマイズされたウェブサービスを提供します。

前のステップでは、すべてのユーザーからの直近 10 回のリクエストが表示されるように、ウェブサービスを更新しました。このステップでは、認証済みのユーザー情報を使用してウェブサービスを更新し、現在認証されているユーザーによる直近 10 回のリクエストだけがページに一覧表示されるようにします。

始める前に

このガイドでこれまでのステップをすべて完了している場合は、このセクションをスキップできます。 それ以外の場合は、次のいずれかを実行してください。

  • Python 3.7 アプリのビルドから始めて、ここまでのステップをすべて完了します。

  • Cloud プロジェクトがすでにある場合は、次のようにウェブサービスのコピーをダウンロードして Firebase を追加すれば、これ以降の処理を続行できます。

    1. Git を使用してサンプル アプリケーション リポジトリをダウンロードします。

      git clone https://github.com/GoogleCloudPlatform/python-docs-samples
      

      または、zip 形式のサンプルをダウンロードして展開します。

    2. 前のステップで用意したファイルのコピーがあるディレクトリに移動します。

      cd python-docs-samples/appengine/standard_python37/building-an-app/building-an-app-3
      
    3. Cloud プロジェクトとウェブサービスに Firebase を追加します。

ユーザー固有のデータの保存と取得

Datastore の祖先を使用して、データと特定のユーザーの関連付けを示すことができます。それにより、Datastore のデータを階層で整理することが可能になります。

その方法は次のとおりです。

  1. store_time および fetch_time メソッドを更新し、Datastore の祖先を使用して visit エンティティを保存、取得できるようにします。

    datastore_client = datastore.Client()
    
    def store_time(email, dt):
        entity = datastore.Entity(key=datastore_client.key('User', email, 'visit'))
        entity.update({
            'timestamp': dt
        })
    
        datastore_client.put(entity)
    
    def fetch_times(email, limit):
        ancestor = datastore_client.key('User', email)
        query = datastore_client.query(kind='visit', ancestor=ancestor)
        query.order = ['-timestamp']
    
        times = query.fetch(limit=limit)
    
        return times

    visit エンティティに祖先が関連付けられました。これらの祖先は、個々の認証済みユーザーを表す Datastore のエンティティです。各祖先のキーには、User kind と、認証済みユーザーのメールアドレスであるカスタム ID が含まれています。祖先キーを使用して、特定のユーザーに関連付けられている時間に対してのみデータベースへのクエリを行います。

  2. root メソッド内の store_times メソッド呼び出しを更新して、id_token 条件内に移動し、サーバーがユーザーを認証した場合のみ実行されるようにします。

    @app.route('/')
    def root():
        # Verify Firebase auth.
        id_token = request.cookies.get("token")
        error_message = None
        claims = None
        times = None
    
        if id_token:
            try:
                # Verify the token against the Firebase Auth API. This example
                # verifies the token on each page load. For improved performance,
                # some applications may wish to cache results in an encrypted
                # session store (see for instance
                # http://flask.pocoo.org/docs/1.0/quickstart/#sessions).
                claims = google.oauth2.id_token.verify_firebase_token(
                    id_token, firebase_request_adapter)
    
                store_time(claims['email'], datetime.datetime.now())
                times = fetch_times(claims['email'], 10)
    
            except ValueError as exc:
                # This will be raised if the token is expired or any other
                # verification checks fail.
                error_message = str(exc)
    
        return render_template(
            'index.html',
            user_data=claims, error_message=error_message, times=times)

インデックスの構成

Datastore はインデックスに基づいてクエリを作成します。単純なエンティティでは、Datastore がそれらのインデックスを自動的に生成します。ただし、祖先があるエンティティなど、より複雑なエンティティについては、インデックスを自動的に生成することはできません。 そのため、visit エンティティについてはインデックスを手動で作成し、Datastore が visit エンティティを含むクエリを実行できるようにする必要があります。

visit エンティティのインデックスを作成する手順は次のとおりです。

  1. プロジェクトのルート ディレクトリに index.yaml ファイル(building-an-app など)を作成し、次のインデックスを追加します。

    indexes:
    
    - kind: visit
      ancestor: yes
      properties:
      - name: timestamp
        direction: desc
    
  2. 次のコマンドを実行し、以下のプロンプトに従って index.yaml インデックスを Datastore にデプロイします。

    gcloud datastore indexes create index.yaml
    

Datastore でインデックスを作成するには、少し時間がかかる場合があります。App Engine にウェブサービスをデプロイする前にインデックスを作成することで、そのインデックスを使用してローカルでテストを行い、構築中のインデックスを必要とするクエリで発生する例外を防止できます。

ヒント: Datastore コンソールで作成したインデックスを表示できます。

インデックスの表示

データストア インデックスの作成の詳細については、データストア インデックスの構成をご覧ください。

ウェブサービスのテスト

ウェブサービスを仮想環境でローカルに実行してテストします。

  1. プロジェクトのメイン ディレクトリで次のコマンドを実行して、ウェブサービスを実行します。 ローカルテスト用に仮想環境を設定していない場合は、ウェブサービスのテストをご覧ください。

    python main.py
    
  2. ウェブサービスを表示するには、ウェブブラウザに次のアドレスを入力します。

    http://localhost:8080
    

ウェブサービスのデプロイ

以上で Datastore をローカルで使用できるようになったため、ウェブサービスを App Engine に再デプロイできます。

プロジェクトのルート ディレクトリから次のコマンドを実行します。ここで、app.yaml ファイルは次の場所にあります。

gcloud app deploy

すべてのトラフィックは、デプロイした新しいバージョンに自動的にルーティングされます。

バージョン管理の詳細については、サービスとバージョンの管理をご覧ください。

サービスの表示

ブラウザを速やかに起動して https://PROJECT_ID.REGION_ID.r.appspot.com でウェブサービスにアクセスするには、次のコマンドを実行します。

gcloud app browse

次の手順

Datastore データ ストレージと Firebase 認証を使用して、認証済みユーザーにパーソナライズされたウェブページを提供するウェブサービスを構築しました。

プロジェクトのシャットダウン、停止、課金の無効化により、クリーンアップを行えます。