Mempersonalisasi Data untuk Pengguna yang Diautentikasi

ID region

REGION_ID adalah kode singkat yang ditetapkan Google berdasarkan region yang Anda pilih saat membuat aplikasi. Kode ini tidak sesuai dengan negara atau provinsi, meskipun beberapa ID region mungkin tampak mirip dengan kode negara dan provinsi yang umum digunakan. Untuk aplikasi yang dibuat setelah Februari 2020, REGION_ID.r disertakan dalam URL App Engine. Untuk aplikasi lama yang dibuat sebelum tanggal tersebut, ID region bersifat opsional dalam URL.

Pelajari ID region lebih lanjut.

Menggunakan informasi pengguna yang diautentikasi untuk menyimpan dan mengambil data spesifik per pengguna, serta mempersonalisasi pengalaman setiap pengguna dengan layanan web Anda.

Pada langkah sebelumnya, Anda telah memperbarui layanan web untuk menampilkan sepuluh permintaan terakhir dari semua pengguna. Pada langkah ini, Anda akan menggunakan informasi pengguna yang diautentikasi untuk mengupdate layanan web Anda, sehingga halaman tersebut hanya menampilkan daftar sepuluh permintaan terakhir yang dibuat oleh pengguna yang saat ini diautentikasi.

Sebelum Memulai

Jika Anda telah menyelesaikan semua langkah sebelumnya dalam panduan ini, lewati bagian ini. Jika tidak, selesaikan salah satu langkah berikut:

  • Mulai dari Membuat Aplikasi Python 3 dan selesaikan semua langkah menuju langkah ini.

  • Jika sudah memiliki project Google Cloud, Anda dapat melanjutkan dengan mendownload salinan layanan web dan menambahkan Firebase:

    1. Download repositori aplikasi contoh menggunakan Git:

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

      Atau, Anda dapat mendownload sampel sebagai file zip, lalu mengekstraknya.

    2. Buka direktori yang berisi salinan file dari langkah sebelumnya:

      cd python-docs-samples/appengine/standard_python3/building-an-app/building-an-app-3
      
    3. Tambahkan Firebase ke project Google Cloud dan layanan web.

Penyimpanan dan pengambilan data spesifik per pengguna

Anda dapat menunjukkan bahwa data terhubung ke pengguna tertentu dengan menggunakan ancestor Firestore dalam mode Datastore (Datastore), yang memungkinkan Anda mengatur data Datastore secara hierarkis.

Untuk melakukannya, selesaikan langkah-langkah berikut:

  1. Update metode store_time dan fetch_time Anda untuk menggunakan ancestor Datastore untuk menyimpan dan mengambil entity 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
    
    

    Setiap entity visit kini memiliki ancestor yang terhubung dengannya. Ancestor ini adalah entity Datastore yang mewakili setiap pengguna yang diautentikasi. Setiap key ancestor menyertakan kind User dan ID kustom, yang merupakan alamat email pengguna yang diautentikasi. Anda menggunakan kunci ancestor untuk membuat kueri database hanya untuk waktu yang terkait dengan pengguna tertentu.

  2. Update panggilan metode store_times dalam metode root Anda dan pindahkan ke dalam kondisional id_token sehingga hanya berjalan jika server telah mengautentikasi pengguna:

    @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(tz=datetime.timezone.utc))
                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
        )
    
    

Mengonfigurasi indeks

Datastore membuat kueri berdasarkan indeks. Untuk entity sederhana, Datastore otomatis membuat indeks ini. Namun, metode ini tidak dapat membuat indeks secara otomatis untuk entity yang lebih rumit, termasuk yang memiliki ancestor. Oleh karena itu, Anda perlu membuat indeks untuk entity visit secara manual sehingga Datastore dapat menjalankan kueri yang melibatkan entity visit.

Untuk membuat indeks bagi entity visit, selesaikan langkah-langkah berikut:

  1. Buat file index.yaml di direktori utama project Anda, misalnya building-an-app, lalu tambahkan indeks berikut:

    # Copyright 2021 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    indexes:
    
    - kind: visit
      ancestor: yes
      properties:
      - name: timestamp
        direction: desc
    
  2. Deploy indeks index.yaml Anda di Datastore dengan menjalankan perintah berikut dan mengikuti prompt-nya:

    gcloud datastore indexes create index.yaml
    

Datastore perlu waktu beberapa saat untuk membuat indeks. Membuat indeks sebelum men-deploy layanan web ke App Engine memungkinkan Anda melakukan pengujian secara lokal menggunakan indeks tersebut dan mencegah pengecualian yang mungkin terjadi untuk kueri yang memerlukan indeks yang masih dalam proses pembuatan.

Melihat indeks Anda

Untuk informasi lebih lanjut tentang pembuatan indeks Datastore, lihat Mengonfigurasi Indeks Datastore.

Menguji layanan web Anda

Uji layanan web Anda dengan menjalankannya secara lokal di lingkungan virtual:

  1. Jalankan perintah berikut di direktori utama project untuk menjalankan layanan web Anda. Jika Anda belum menyiapkan lingkungan virtual untuk pengujian lokal, lihat menguji layanan web Anda.

    python main.py
    
  2. Masukkan alamat berikut di browser web untuk melihat layanan web Anda:

    http://localhost:8080
    

Men-deploy layanan web Anda

Setelah Datastore berfungsi secara lokal, Anda dapat men-deploy ulang layanan web ke App Engine.

Jalankan perintah berikut dari direktori utama project, tempat file app.yaml Anda berada:

gcloud app deploy

Semua traffic akan otomatis dirutekan ke versi baru yang Anda deploy.

Untuk mengetahui informasi selengkapnya tentang mengelola versi, lihat Mengelola Layanan dan Versi.

Melihat layanan Anda

Untuk meluncurkan browser dan mengakses layanan web dengan cepat di https://PROJECT_ID.REGION_ID.r.appspot.com, jalankan perintah berikut:

gcloud app browse

Langkah Berikutnya

Selamat! Anda telah berhasil membuat layanan web yang menggunakan penyimpanan data Datastore dan autentikasi Firebase untuk memberikan halaman web yang dipersonalisasi kepada pengguna yang diautentikasi.

Sekarang, Anda dapat membersihkannya dengan mematikan atau menonaktifkan penagihan untuk project Anda.