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

מזהה אזור

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.

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

gcloud app deploy

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

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

צפייה בשירות

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

gcloud app browse

השלבים הבאים

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

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