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

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

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

始める前に

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

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

  • GCP プロジェクトがすでにある場合は、次のようにウェブサービスのコピーをダウンロードして 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. GCP プロジェクトとウェブサービスに Firebase を追加します。

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

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

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

  1. store_time および fetch_time メソッドを更新して、Cloud 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 エンティティに祖先が関連付けられました。これらの祖先は、個々の認証済みユーザーを表す Cloud 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)

インデックスの構成

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

visit エンティティのインデックスを作成するには、次の手順を実行します。

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

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

    gcloud datastore indexes create index.yaml
    

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

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

インデックスの表示

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

ウェブサービスのテスト

virtualenv を使用して依存関係を処理し、ウェブサービスをローカルで実行してテストします。

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

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

    http://localhost:8080
    

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

Cloud Datastore がローカルで動作するようになったので、ウェブサービスを App Engine に再デプロイします。

app.yaml ファイルがあるプロジェクトのルート ディレクトリで、次のコマンドを実行します。

gcloud app deploy

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

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

サービスを表示する

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

gcloud app browse

次のステップ

これで、Cloud Datastore のデータ ストレージと Firebase authentication を使用して認証済みユーザーにパーソナルなウェブページを提供する、ウェブサービスを構築しました。

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

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Python 3 の App Engine スタンダード環境