인증된 사용자의 데이터 맞춤설정

리전 ID

REGION_ID는 앱을 만들 때 선택한 리전을 기준으로 Google에서 할당하는 축약된 코드입니다. 일부 리전 ID는 일반적으로 사용되는 국가 및 주/도 코드와 비슷하게 표시될 수 있지만 코드는 국가 또는 주/도와 일치하지 않습니다. 2020년 2월 이후에 생성된 앱의 경우 REGION_ID.r이 App Engine URL에 포함됩니다. 이 날짜 이전에 만든 기존 앱의 경우 URL에서 리전 ID는 선택사항입니다.

리전 ID에 대해 자세히 알아보세요.

인증된 사용자 정보를 사용하여 사용자별 데이터를 저장 및 검색하고 웹 서비스를 통해 각 사용자의 환경을 맞춤설정하세요.

이전 단계에서는 모든 사용자의 최근 10개 요청을 표시하도록 웹 서비스를 업데이트했습니다. 이 단계에서는 인증된 사용자 정보를 사용하여 웹 서비스를 업데이트하므로 페이지에 현재 인증된 사용자가 한 최근 10개의 요청 목록만 표시됩니다.

시작하기 전에

이 가이드의 이전 단계를 모두 완료했다면 이 섹션을 건너뜁니다. 그렇지 않으면 다음 중 하나를 완료합니다.

사용자별 데이터 저장 및 검색

Datastore 데이터를 계층 구조로 구성할 수 있는 Datastore 모드의 Firestore(Datastore) 상위 항목을 사용하여 데이터가 특정 사용자와 연관되어 있음을 나타낼 수 있습니다.

이렇게 하려면 다음 단계를 완료해야 합니다.

  1. Datastore 상위 항목을 사용하여 visit 항목을 저장하고 검색하도록 store_timefetch_time 메서드를 업데이트합니다.

    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 종류와 인증된 사용자의 이메일 주소인 커스텀 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(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가 자동으로 생성합니다. 하지만 상위 항목이 있는 항목 등, 복잡한 항목에 대한 색인은 자동으로 생성되지 않습니다. 따라서 Datastore가 visit 항목과 관련된 쿼리를 수행할 수 있도록 visit 항목에 대한 색인을 수동으로 만들어야 합니다.

visit 항목의 색인을 만들려면 다음 단계를 완료합니다.

  1. 프로젝트의 루트 디렉터리(예: building-an-app)에 index.yaml 파일을 만들고 다음 색인을 추가합니다.

    # 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. 다음 명령어를 실행하고 표시되는 메시지에 따라 Datastore에 index.yaml 색인을 배포합니다.

    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 인증을 사용하여 인증된 사용자에게 맞춤설정된 웹페이지를 제공하는 웹 서비스를 성공적으로 빌드했습니다.

이제 프로젝트를 종료, 비활성화하거나 프로젝트에 대한 청구를 사용 중지하여 정리하면 됩니다.