Menangani sesi dengan Firestore

Banyak aplikasi memerlukan penanganan sesi untuk autentikasi dan preferensi pengguna. Framework Flask dilengkapi dengan implementasi berbasis memori untuk menjalankan fungsi ini. Namun, implementasi ini tidak cocok untuk aplikasi yang dapat ditayangkan dari beberapa instance, karena sesi yang direkam dalam satu instance mungkin berbeda dengan instance lainnya. Tutorial ini menunjukkan cara menangani sesi di App Engine.

Tujuan

  • Menulis aplikasi.
  • Menjalankan aplikasi secara lokal.
  • Men-deploy aplikasi di App Engine.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen yang dapat ditagih sebagai berikut Google Cloud:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, baca bagian Pembersihan.

Sebelum memulai

  1. 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

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

  3. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  4. Instal Google Cloud CLI.

  5. Konfigurasi gcloud CLI agar menggunakan identitas gabungan Anda.

    Untuk mengetahui informasi selengkapnya, lihat Login ke gcloud CLI dengan identitas gabungan Anda.

  6. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  7. Instal Python, pip, dan virtualenv di sistem Anda. Untuk mengetahui petunjuknya, lihat Menyiapkan lingkungan pengembangan Python untuk Google Cloud.

Menyiapkan project

  1. Di jendela terminal, mulai di direktori pilihan Anda dan buat direktori baru bernama sessions. Semua kode untuk tutorial ini berada di dalam direktori sessions.

  2. Ubah ke direktori sessions:

    cd sessions
    
  3. Buat requirements.txt dengan konten berikut:

    google-cloud-firestore==2.11.1
    flask==2.2.5
    
  4. Instal dependensinya:

    pip install  -r requirements.txt
    

Di akhir tutorial ini, struktur file akhir akan mirip dengan yang berikut:

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

Menulis aplikasi web

Aplikasi ini menampilkan sapaan dalam berbagai bahasa untuk setiap pengguna. Pengguna yang kembali akan selalu disambut dalam bahasa yang sama.

Beberapa jendela aplikasi menampilkan ucapan dalam berbagai bahasa.

Sebelum aplikasi dapat menyimpan preferensi untuk pengguna, Anda memerlukan cara untuk menyimpan informasi tentang pengguna saat ini dalam sesi. Aplikasi contoh ini menggunakan cookie dan Firestore untuk menyimpan data sesi.

  • Di jendela terminal, buat file bernama main.py dengan konten berikut:

    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)
  • Diagram berikut mengilustrasikan cara Firestore menangani sesi untuk aplikasi App Engine.

    Diagram arsitektur: pengguna, App Engine, Firestore.

Menghapus sesi

Anda dapat menghapus data sesi atau menerapkan strategi penghapusan otomatis. Jika Anda menggunakan solusi penyimpanan untuk sesi seperti Memcache atau Redis, sesi yang berakhir masa berlakunya akan otomatis dihapus.

Berjalan secara lokal

  1. Di jendela terminal, instal server HTTP Gunicorn:

    pip install gunicorn
    
  2. Jalankan server HTTP Gunicorn:

    gunicorn -b :8080 main:app
    
  3. Lihat aplikasi di browser web Anda:

    Cloud Shell

    Di toolbar Cloud Shell, klik Web preview Pratinjau web dan pilih Preview on port 8080.

    Mesin lokal

    Di browser Anda, buka http://localhost:8080

    Anda akan melihat salah satu dari lima sapaan: "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde", atau "Ciao Mondo". Bahasa akan berubah jika Anda membuka halaman di browser lain atau dalam mode penyamaran. Anda dapat melihat dan mengedit data sesi di Google Cloud konsol.

    Sesi Firestore di konsol Google Cloud .

  4. Untuk menghentikan server HTTP, di jendela terminal, tekan Control+C.

Men-deploy dan menjalankan di App Engine

Anda dapat menggunakan lingkungan standar App Engine untuk membangun dan men-deploy aplikasi yang berjalan secara andal dalam beban berat dan dengan data dalam jumlah besar.

Tutorial ini menggunakan lingkungan standar App Engine untuk men-deploy server.

  1. Di jendela terminal, buat file app.yaml dan salin kode berikut:

    runtime: python37
  2. Deploy aplikasi di App Engine:

    gcloud app deploy
    
  3. Lihat aplikasi live di https://your-project-id.appspot.com:

    gcloud app browse
    

    Dengan your-project-id adalah Google Cloud project ID Anda.

Sapaan kini dikirim oleh server web yang berjalan pada instance App Engine.

Men-debug aplikasi

Jika Anda tidak dapat terhubung ke aplikasi App Engine, periksa hal-hal berikut:

  1. Pastikan perintah gcloud deploy berhasil diselesaikan dan tidak menampilkan error apa pun. Jika ada error (misalnya, message=Build failed), perbaiki, lalu coba deploy aplikasi App Engine lagi.
  2. Di Google Cloud konsol, buka halaman Logs Explorer.

    Buka halaman Logs Explorer

    1. Di menu drop-down Recently selected resources, klik App Engine Application, lalu klik All module_id. Anda akan melihat daftar permintaan saat Anda mengunjungi aplikasi. Jika tidak melihat daftar permintaan, pastikan Anda memilih All module_id dari menu drop-down. Jika Anda melihat pesan error yang dicetak ke Google Cloud konsol, pastikan kode aplikasi Anda cocok dengan kode di bagian tentang menulis aplikasi web.

    2. Pastikan Firestore API diaktifkan.

Pembersihan

Menghapus project

  1. Di Google Cloud konsol, buka halaman Manage resources.

    Buka Kelola resource

  2. Pada daftar project, pilih project yang Anda ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus instance App Engine

  1. Di Google Cloud konsol, buka halaman Versions untuk App Engine.

    Buka Versi

  2. Pilih kotak centang untuk versi aplikasi non-default yang ingin Anda hapus.
  3. Untuk menghapus versi aplikasi, klik Hapus.

Langkah berikutnya