Để hiểu được ý tưởng cơ bản đằng sau lưu trữ phiên trong bộ nhớ đệm phía máy chủ, bạn sẽ thực hiện một ứng dụng nhỏ bằngFlask, một microframework để phát triển web trong Python. Vì trọng tâm sẽ là các khái niệm chứ không phải các chi tiết cụ thể của một framework và ngôn ngữ nhất định, bạn có thể dịch các ví dụ sang framework web và ngôn ngữ lập trình lựa chọn.

Nếu muốn bắt đầu với Flask, hãy làm theohướng dẫn cài đặthướng dẫn bắt đầu nhanh.

Dưới đây là một ứng dụng rất cơ bản cho phép bạn đăng nhập và đăng xuất:

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('/')

Phần còn lại của ví dụ sẽ dựa trên đoạn mã này. Bạn có thể tìm thấy mã cho tất cả các ví dụ trong kho lưu trữ này.

Nếu đã cài đặt Flask và muốn khởi động ứng dụng này, hãy sao chép mã vào tệp có tên example-1.py. Sau đó, bạn cần xuất hai biến môi trường: FLASK_APP nên được đặt thành example-1.py và SECRET_KEY nên được đặt thành một chuỗi ngẫu nhiên, ví dụ Y0PJWblKsg1axM4fGW. Nếu cần trợ giúp thiết lập các biến môi trường, hãy xem hướng dẫn bắt đầu nhanh của Flask.

Khi đã thiết lập xong, hãy chạy lệnh sau:

syntax: shell

$ flask run -h 0.0.0.0 -p 5000 --reload

Sau đó đến http://your_flask_endpoint:5000, nơi bạn sẽ thấy ứng dụng của mình đang chạy. Bạn cần thay your_flask_endpoint bằng tên DNS công khai của phiên bản EC2 như đã làm trong phần Yêu cầu.

Có ba tuyến có sẵn: “/”, “/login”, và “/logout”. Lần lượt truy cập tất cả và bạn sẽ quen thuộc với các thao tác cơ bản.

Thời gian hoàn thành mô-đun: 60 - 90 phút


Ví dụ này sử dụng cookie để lưu trữ tên người dùng. Khi bạn truy cập ứng dụng lần đầu tiên, không có tên người dùng nào được lưu trong đối tượng phiên. Khi bạn truy cập vào “/login” và cung cấp tên người dùng, giá trị được lưu trữ trong cookie được xác nhận và bạn được chuyển hướng đến trang chủ. Sau đó, nếu bạn truy cập vào “/logout”, tên người dùng sẽ bị xóa khỏi phiên và bạn quay lại nơi bắt đầu.

Bạn sẽ mở rộng ứng dụng cơ bản này với các phiên phía máy chủ, nhưng trước tiên, hãy đảm bảo rằng bạn có thể kết nối đến Redis.



Bước 2.1

(Nhấp vào để phóng to)

Bước 2.1

Trong các ví dụ, mỗi lần điểm cuối Redis được nhắc đến, bạn nên dùng tên máy chủ của Điểm cuối chính của bạn. 

Bước 2.2

(Nhấp vào để phóng to)

Bước 2.2

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**

Nếu lệnh không chạy, thì cài đặt Nhóm bảo mật đang chặn bạn. Xác minh rằng phiên bản EC2 của bạn có quyền truy nhập vào nhóm bảo mật được chỉ định cho phiên bản ElastiCache của bạn. Ví dụ: giả sử phiên bản EC2 của bạn được chỉ định cho nhóm bảo mật mặc định. Giờ bạn có thể sửa đổi nhóm bảo mật của phiên bản Amazon ElastiCache và thêm quy tắc TCP tùy chỉnh cho phép kết nối trên cổng 6379 từ phiên bản bất kỳ trong nhóm bảo mật mặc định: 

Bước 2.5

Trong Nguồn, bạn có thể bắt đầu nhập tên của nhóm bảo mật và có thể nhấp vào ID nhóm bảo mật. Nếu cần tìm hiểu thêm về Nhóm bảo mật, bạn có thể xem tài liệu hướng dẫn hoặc Tài liệu tham khảo quy tắc nhóm bảo mật.


Hãy quay lại với ví dụ. Bây giờ bạn sẽ đưa ramột số thay đổi nhỏ cho phép bạn lưu trữ dữ liệu phiên trong Redis. Đây là ví dụ thứ hai với những thay đổi đó:

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('/')

Bây giờ Redis được nhập và khởi tạo, chỉ mục sẽ đảm nhiệm việc tăng bộ đếm và hiển thị nó cho người dùng.

Lưu ý rằng lệnh Redis bạn đã sử dụng để tăng bộ đếm là HINCRBY. Đó là vì bạn đang sử dụng mã hash Redis cho mỗi phiên người dùng.


Bây giờ bạn sẽ đặt Thời gian dữ liệu tồn tại (TTL) cho phiên phía máy chủ. Chỉ có thêmmột dòng mã và đoạn mã này sẽ chỉ bao gồm tuyến /.

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

Khóa nơi phiên được lưu trữ sẽ hết hạn sau 10 giây. TTL này rất ngắn, và chỉ hữu ích cho ví dụ này. Nếu bạn chạy ứng dụng ngay bây giờ, bạn sẽ thấy việc truy cập chỉ mục sẽ cập nhật bộ đếm Lượt truy cập như thế nào, nhưng nếu bạn không truy cập trang đó trong vòng 10 giây, thì vào lần làm mới tiếp theo, bộ đếm sẽ quay lại 1.


Ví dụ ngắn này là đủ để tìm hiểu những điều cơ bản của phiên phía máy chủ, nhưng trong thực tế, bạn sẽ làm khác đi: thay vì lưu trữ tên người dùng, bạn sẽ tạo và lưu trữ token sau khi người dùng được xác thực. Token đó sẽ đại diện cho khóa Redis, nơi tất cả dữ liệu phiên phía máy chủ sẽ được lưu trữ. Bạn có thể muốn tóm lược một số thao tác được trình bày ở đây để mọi quyền truy nhập vào phiên phía máy chủ sẽ làm mới TTL mà không cần sự can thiệp của bạn. Trong kho lưu trữ, bạn sẽ tìm thấy ví dụ cung cấp loại SessionStore tóm lược thao tác đó.