Untuk memahami ide dasar di balik caching sesi sisi-server, Anda akan mengimplementasikan aplikasi kecil menggunakan Flask, sebuah mikroframework untuk pengembangan web dengan Python. Karena fokusnya adalah pada konsep dan bukan perincian kerangka kerja dan bahasa tertentu, Anda dapat menerjemahkan contoh ke kerangka kerja web dan bahasa pemrograman pilihan Anda.
Jika Anda ingin memulai dengan Flask, ikuti instruksi instalasi dan panduan mulai cepat.
Di bawah ini adalah aplikasi yang sangat mendasar yang memungkinkan Anda masuk dan keluar:
syntax: python
import os from flask import Flask, session, redirect, escape, request app = Flask(__name__) app.secret_key = os.environ.get('SECRET_KEY', default=None) @app.route('/') def index(): if 'username' in session: return 'Logged in as %s' % escape(session['username']) return 'You are not logged in' @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect('/') return ''' <form method="post"> <p><input type=text name=username> <p><input type=submit value=Login> </form> ''' @app.route('/logout') def logout(): session.pop('username', None) return redirect('/')
Seluruh contoh akan didasarkan pada snippet ini. Sampel kode untuk semua contoh dapat ditemukan di repositori ini.
Jika Anda memasang Flask dan ingin mem-boot aplikasi ini, salin kodenya ke file bernama example-1.py. Maka Anda perlu mengekspor dua variabel lingkungan: FLASK_APP harus diatur ke example-1.py, dan SECRET_KEY harus diatur ke string acak, misalnya Y0PJWblKsg1axM4fGW. Jika Anda perlu bantuan mengatur variabel lingkungan, lihat panduan mulai cepat Flask.
Setelah Anda siap, jalankan perintah ini:
syntax: shell
$ flask run -h 0.0.0.0 -p 5000 --reload
Lalu menuju ke http://your_flask_endpoint:5000, tempat Anda seharusnya melihat aplikasi Anda berjalan. Anda harus mengganti your_flask_endpoint dengan nama DNS Publik dari instans EC2, seperti yang Anda lakukan di Persyaratan.
Ada tiga rute yang tersedia: “/”, “/login”, and “/logout”. Kunjungi semua bergantian dan Anda akan terbiasa dengan perilaku dasar ini.
Waktu untuk Menyelesaikan Modul: 60 - 90 Menit
Contohnya menggunakan cookie untuk menyimpan nama pengguna. Saat pertama Anda mengunjungi aplikasi, tidak ada nama pengguna yang tersimpan di objek sesi ini. Saat Anda masuk ke "/ login" dan memberikan nama pengguna, nilainya disimpan dalam cookie yang ditandatangani dan Anda akan diarahkan ke beranda. Kemudian, jika Anda pergi ke "/ logout", nama pengguna dihapus dari sesi dan Anda kembali ke tempat Anda memulai.
Anda akan memperpanjang aplikasi dasar ini dengan sesi sisi server, tetapi pertama-tama pastikan Anda dapat terhubung ke Redis.
Dalam contoh, setiap kali titik akhir disebutkan, Anda harus menggunakan nama host dari Titik Akhir Primer Anda.
syntax: shell
$ export REDIS_URL="redis://your_redis_endpoint:6379"
syntax: shell
$ python
syntax: python
>>> import redis >>> client = redis.Redis.from_url('redis://your_redis_endpoint:6379') >>> client.ping() **True**
Jika perintahnya hang, berarti Anda sedang diblokir oleh pengaturan Security Group. Verifikasi bahwa instans EC2 Anda memiliki akses ke grup keamanan yang ditetapkan untuk instans ElastiCache Anda. Contoh, misalnya instans EC2 Anda ditetapkan untuk grup keamanan default. Anda kini bisa mengubah grup keamanan instans Amazon ElastiCache dan menambahkan aturan TCP Khusus yang mengizinkan koneksi pada port 6379 dari instans mana pun di grup keamanan default:
Di Sumber, Anda dapat mulai mengetik nama grup keamanan dan Anda akan bisa klik pada Security Group ID. Jika Anda perlu belajar lebih tentang Security Groups, Anda bisa memeriksa dokumentasi atau Security Group Rules Reference.
Mari kembali ke contoh. Sekarang Anda akan memperkenalkan beberapa perubahan kecil yang memungkinkan Anda menyimpan data sesi di Redis. Inilah contoh kedua dengan perubahan itu:
syntax: python
import os import redis from flask import Flask, session, redirect, escape, request app = Flask(__name__) app.secret_key = os.environ.get('SECRET_KEY', default=None) # BEGIN NEW CODE - PART 1 # REDIS_URL = os.environ.get('REDIS_URL') store = redis.Redis.from_url(REDIS_URL) # END NEW CODE - PART 1 # @app.route('/') def index(): if 'username' in session: # BEGIN NEW CODE - PART 2 # username = escape(session['username']) visits = store.hincrby(username, 'visits', 1) return ''' Logged in as {0}.<br> Visits: {1} '''.format(username, visits) # END NEW CODE - PART 2 # return 'You are not logged in' @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect('/') return ''' <form method="post"> <p><input type=text name=username> <p><input type=submit value=Login> </form>''' @app.route('/logout') def logout(): session.pop('username', None) return redirect('/')
Sekarang Redis diimpor dan diinisialisasi, dan indeks menangani penambahan penghitung dan menampilkannya kepada pengguna.
Perhatikan bahwa perintah Redis yang Anda gunakan untuk menambah penghitung adalah HINCRBY. Itu karena Anda menggunakan hash Redis untuk setiap sesi pengguna.
Sekarang Anda akan mengatur Time to Live (TTL) ke sesi sisi server. Ini hanya satu baris kode tambahan, dan cuplikan ini hanya akan menyertakan / rute.
syntax: python
... @app.route('/') def index(): if 'username' in session: username = escape(session['username']) visits = store.hincrby(username, 'visits', 1) # BEGIN NEW CODE # store.expire(username, 10) # END NEW CODE # return ''' Logged in as {0}.<br> Visits: {1} '''.format(username, visits) return 'You are not logged in' ...
Kunci tempat sesi disimpan akan berakhir dalam 10 detik. TTL yang sangat singkat, hanya berguna untuk contoh ini. Jika Anda menjalankan aplikasi sekarang, Anda akan melihat bagaimana mengunjungi indeks memperbarui penghitung Kunjungan, tetapi jika Anda membiarkan 10 detik berlalu tanpa mengunjungi halaman itu, pada penyegaran berikutnya penghitung akan kembali pada 1.
Contoh singkat ini cukup untuk mempelajari dasar-dasar sesi sisi server, tetapi dalam skenario dunia nyata Anda akan melakukan sesuatu yang berbeda: alih-alih menyimpan nama pengguna, Anda akan membuat dan menyimpan token setelah pengguna diautentikasi. Token itu akan mewakili kunci Redis di mana semua data sesi sisi server akan disimpan. Anda mungkin juga ingin mengabstraksi beberapa perilaku yang disajikan di sini, sehingga setiap akses ke sesi sisi server menyegarkan TTL tanpa campur tangan Anda. Di repositori, Anda akan menemukan contoh yang menyediakan kelas SessionStore yang mengabstraksi perilaku itu.