התאמה אישית של נתונים למשתמשים מאומתים

מזהה אזור

REGION_ID הוא קוד מקוצר ש-Google מקצה על סמך האזור שבוחרים כשיוצרים את האפליקציה. הקוד לא תואם למדינה או למחוז, למרות שחלק ממזהי האזורים עשויים להיראות דומים לקודים נפוצים של מדינות ומחוזות. באפליקציות שנוצרו אחרי פברואר 2020, REGION_ID.r נכלל בכתובות URL של App Engine. באפליקציות קיימות שנוצרו לפני התאריך הזה, מזהה האזור הוא אופציונלי בכתובת ה-URL.

מידע נוסף על מזהי אזורים

השתמשו בפרטי משתמש מאומתים כדי לאחסן ולאחזר נתונים ספציפיים למשתמש, ולהתאים אישית את חוויית השימוש של כל משתמש בשירות האינטרנט שלכם.

בשלב הקודם עדכנתם את שירות האינטרנט כך שיוצגו בו עשר הבקשות האחרונות מכל המשתמשים. בשלב הזה, אתם משתמשים בפרטי משתמש מאומת כדי לעדכן את שירות האינטרנט כך שבדף תוצג רק רשימה של עשר הבקשות האחרונות שנשלחו על ידי המשתמש המאומת הנוכחי.

לפני שמתחילים

אם ביצעתם את כל השלבים הקודמים במדריך הזה, אתם יכולים לדלג על הקטע הזה. אם לא, מבצעים אחת מהפעולות הבאות:

אחסון ואחזור של נתונים ספציפיים למשתמש

אפשר לציין שנתונים מקושרים למשתמש מסוים באמצעות צאצאים של Firestore במצב Datastore ‏ (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 הסוג ומזהה מותאם אישית, שהוא כתובת האימייל של המשתמש המאומת. משתמשים במפתח של רשומת האב כדי להריץ שאילתה במסד הנתונים רק לגבי השעות שמשויכות למשתמש ספציפי.

  2. מעדכנים את הפעלת ה-method store_times בשיטה root ומעבירים אותה לתוך התנאי 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(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
        )
    
    

הגדרת אינדקסים

‫Datastore מבצע שאילתות על סמך אינדקסים. במקרה של ישויות פשוטות, Datastore יוצר את האינדקסים האלה באופן אוטומטי. עם זאת, אי אפשר ליצור אינדקסים באופן אוטומטי לישויות מורכבות יותר, כולל כאלה עם ישויות אב. לכן, צריך ליצור ידנית אינדקס של ישויות visit כדי ש-Datastore יוכל לבצע שאילתות שכוללות ישויות visit.

כדי ליצור אינדקס של ישויות visit, מבצעים את השלבים הבאים:

  1. יוצרים קובץ index.yaml בתיקיית השורש של הפרויקט, לדוגמה building-an-app, ומוסיפים את האינדקס הבא:

    # 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. כדי לפרוס את האינדקסים של index.yaml ב-Datastore, מריצים את הפקודה הבאה ופועלים לפי ההנחיות:

    gcloud datastore indexes create index.yaml
    

יכול לקחת זמן עד ש-Datastore ייצור אינדקסים. יצירת אינדקסים לפני פריסת שירות האינטרנט ב-App Engine מאפשרת לכם לבצע בדיקות מקומיות באמצעות האינדקסים האלה, ומונעת חריגים שעשויים להתרחש בשאילתות שדורשות אינדקס שנמצא עדיין בתהליך בנייה.

עיון באינדקסים

מידע נוסף על יצירת אינדקסים ב-Datastore זמין במאמר בנושא הגדרת אינדקסים ב-Datastore.

בדיקת שירות האינטרנט

בודקים את שירות האינטרנט על ידי הפעלתו באופן מקומי בסביבה וירטואלית:

  1. מריצים את הפקודה הבאה בספרייה הראשית של הפרויקט כדי להפעיל את שירות האינטרנט. אם לא הגדרתם סביבה וירטואלית לבדיקה מקומית, כדאי לעיין במאמר בנושא בדיקת שירות האינטרנט.

    python main.py
    
  2. כדי לראות את שירות האינטרנט, מזינים את הכתובת הבאה בדפדפן האינטרנט:

    http://localhost:8080
    

פריסת שירות האינטרנט

אחרי ש-Datastore פועל באופן מקומי, אפשר לפרוס מחדש את שירות האינטרנט ב-App Engine.

מריצים את הפקודה הבאה מתיקיית הרמה הבסיסית (root) של הפרויקט, שבה נמצא הקובץ app.yaml:

gcloud app deploy

כל התנועה מנותבת אוטומטית לגרסה החדשה שפרסתם.

מידע נוסף על ניהול גרסאות זמין במאמר ניהול שירותים וגרסאות.

צפייה בשירות

כדי להפעיל במהירות את הדפדפן ולגשת לשירות האינטרנט בכתובת https://PROJECT_ID.REGION_ID.r.appspot.com, מריצים את הפקודה הבאה:

gcloud app browse

השלבים הבאים

כל הכבוד! יצרתם בהצלחה שירות אינטרנט שמשתמש באחסון נתונים ב-Datastore ובאימות ב-Firebase כדי לספק למשתמשים מאומתים דף אינטרנט מותאם אישית.

עכשיו אפשר לנקות את הפרויקט על ידי כיבוי, השבתה או השבתת החיוב שלו.