使用 Firestore 處理工作階段

許多應用程式需要處理工作階段以進行驗證和使用者偏好設定。Flask 架構隨附以記憶體為基礎的實作,以執行此函式。但是,此實作並不適合可從多個執行個體提供的應用程式,因為記錄在一個執行個體中的工作階段可能與其他執行個體不同。本教學課程說明如何在 App Engine 上處理工作階段。

目標

  • 編寫應用程式。
  • 在本機執行應用程式。
  • 在 App Engine 上部署應用程式。

費用

在本文件中,您會使用下列 Google Cloud的計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. 安裝 Google Cloud CLI。

  6. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  7. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  11. 安裝 Google Cloud CLI。

  12. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  13. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  14. 在系統上安裝 Python、pipvirtualenv。如需操作說明,請參閱設定 Python 開發環境一文。 Google Cloud

設定專案

  1. 在終端機視窗中,從您選擇的目錄開始,建立一個新目錄,名稱為 sessions。本教學課程的所有程式碼都在 sessions 目錄中。

  2. 變更至 sessions 目錄:

    cd sessions
    
  3. 建立 requirements.txt,並加入以下內容:

    google-cloud-firestore==2.11.1
    flask==2.2.5
    
  4. 安裝依附元件:

    pip install  -r requirements.txt
    

在本教學課程的最後,最終的檔案結構如下所示:

sessions
├── app.yaml
├── main.py
└── requirements.txt

編寫網頁應用程式

這個應用程式為每個使用者顯示不同語言的問候語。系統一律會用與上次相同的語言問候回訪者。

多個應用程式視窗會顯示不同語言的問候語。

您必須先將目前使用者的相關資訊儲存在工作階段中,應用程式才能儲存使用者的偏好設定。這個範例應用程式使用 Cookie 和 Firestore 儲存工作階段資料。

  • 在終端機視窗中,建立名稱為 main.py 的檔案,包含以下內容:

    import random
    from uuid import uuid4
    
    from flask import Flask, make_response, request
    from google.cloud import firestore
    
    
    app = Flask(__name__)
    db = firestore.Client()
    sessions = db.collection('sessions')
    greetings = [
        'Hello World',
        'Hallo Welt',
        'Ciao Mondo',
        'Salut le Monde',
        'Hola Mundo',
    ]
    
    
    @firestore.transactional
    def get_session_data(transaction, session_id):
        """ Looks up (or creates) the session with the given session_id.
            Creates a random session_id if none is provided. Increments
            the number of views in this session. Updates are done in a
            transaction to make sure no saved increments are overwritten.
        """
        if session_id is None:
            session_id = str(uuid4())   # Random, unique identifier
    
        doc_ref = sessions.document(document_id=session_id)
        doc = doc_ref.get(transaction=transaction)
        if doc.exists:
            session = doc.to_dict()
        else:
            session = {
                'greeting': random.choice(greetings),
                'views': 0
            }
    
        session['views'] += 1   # This counts as a view
        transaction.set(doc_ref, session)
    
        session['session_id'] = session_id
        return session
    
    
    @app.route('/', methods=['GET'])
    def home():
        template = '<body>{} views for "{}"</body>'
    
        transaction = db.transaction()
        session = get_session_data(transaction, request.cookies.get('session_id'))
    
        resp = make_response(template.format(
            session['views'],
            session['greeting']
            )
        )
        resp.set_cookie('session_id', session['session_id'], httponly=True)
        return resp
    
    
    if __name__ == '__main__':
        app.run(host='127.0.0.1', port=8080)
  • 下圖說明 Firestore 如何處理 App Engine 應用程式的工作階段。

    架構圖:使用者、App Engine、Firestore。

刪除工作階段

您可以刪除工作階段資料,或是實作自動化的刪除策略。如果您使用 Memcache 或 Redis 這類工作階段儲存解決方案,則會自動刪除過期的工作階段。

在本機環境中執行

  1. 在終端機視窗中,安裝 Gunicorn HTTP 伺服器

    pip install gunicorn
    
  2. 執行 Gunicorn HTTP 伺服器:

    gunicorn -b :8080 main:app
    
  3. 在網路瀏覽器中檢視應用程式:

    Cloud Shell

    在 Cloud Shell 工具列中,按一下 [Web preview] (網頁預覽) 網頁預覽,然後選取 [Preview on port 8080] (透過以下通訊埠預覽:8080)

    本機電腦

    透過瀏覽器前往以下網址:http://localhost:8080

    您會看到以下五個問候語其中之一:「Hello World」、「Hallo Welt」、「Hola mundo」、「Salut le Monde」或「Ciao Mondo」。如果您在其他瀏覽器或無痕模式中開啟頁面,語言就會變更。您可以在Google Cloud 控制台中查看和編輯工作階段資料。

     Google Cloud 控制台中的 Firestore 工作階段。

  4. 如要停止 HTTP 伺服器,請在您的終端機視窗中,按下 Control+C

在 App Engine 上部署及執行

您可以使用 App Engine 標準環境以建構及部署應用程式,即使是處在高負載和大量資料的情況下,應用程式仍會穩定可靠地執行。

本教學課程使用 App Engine 標準環境來部署伺服器。

  1. 在終端機視窗中,建立 app.yaml 檔案,並複製以下內容:

    runtime: python37
  2. 在 App Engine 上部署應用程式:

    gcloud app deploy
    
  3. https://your-project-id.appspot.com 查看上線的應用程式:

    gcloud app browse
    

    其中 your-project-id 是您的 Google Cloud 專案 ID。

問候語目前是由 App Engine 執行個體上執行的網路伺服器提供。

應用程式偵錯

如果您無法連接到 App Engine 應用程式,請檢查以下內容:

  1. 檢查 gcloud 部署指令是否順利完成,且未輸出任何錯誤。如果發生錯誤 (例如 message=Build failed),請修正錯誤,並再次嘗試部署 App Engine 應用程式
  2. 前往 Google Cloud 控制台的「Logs Explorer」頁面。

    前往「Logs Explorer」(記錄檔探索工具) 頁面

    1. 在「Recently selected resources」(最近選取的資源) 下拉式清單中,點選 [App Engine Application] (App Engine 應用程式),然後按一下 [All module_id] (所有 module_id)。系統隨即會顯示您造訪應用程式時的要求清單。如果您沒看見要求清單,請確認您已從下拉式清單中選取 [All module_id] (所有 module_id)。如果在 Google Cloud 控制台中看到錯誤訊息,請檢查應用程式的程式碼是否與「編寫網頁應用程式」一節中的程式碼相符。

    2. 確認已啟用 Firestore API。

清除所用資源

刪除專案

  1. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

刪除 App Engine 執行個體

  1. 前往 Google Cloud 控制台的 App Engine「Versions」(版本) 頁面。

    前往「版本」

  2. 勾選您要刪除的非預設應用程式版本的核取方塊。
  3. 如要刪除應用程式版本,請按一下 「刪除」

後續步驟