لفهم الفكرة الأساسية للتخزين المؤقت للجلسات من جانب الخادم، ستنفذ تطبيقًا صغيرًا باستخدام Flask، وهو عبارة عن إطار عمل صغير في Python لتطوير الويب. بما أن التركيز سينصب على المفاهيم وليس على تفاصيل إطار العمل المحدد واللغة، يمكنك نقل الأمثلة إلى إطار عمل الويب ولغة البرمجة التي تختارها.

إذا أردت بدء الاستخدام مع Flask، فاتبع تعليمات التثبيت وكذلك دليل بدء الاستخدام.

وفيما يلي تطبيق أساسي للغاية يتيح لك تسجيل الدخول والخروج:

بناء الجملة: 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('/')

ستعتمد الأمثلة الباقية على هذا الجزء. يمكن العثور على التعليمات البرمجية لجميع الأمثلة في هذا المستودع.

إذا كان لديك Flask مثبتٌ وكنت تريد تمهيد هذا التطبيق، فانسخ التعليمات البرمجية إلى ملف باسم example-1.py. وبعد ذلك، يجب تصدير متغيرين للبيئة وهما: FLASK_APP وينبغي تعيينه إلى example-1.py وSECRET_KEY وينبغي تعيينه إلى سلسلة عشوائية، مثل Y0PJWblKsg1axM4fGW. إذا كنت بحاجة إلى المساعدة في إعداد متغيرات البيئة، فتحقق من دليل بدء استخدام Flask.

بمجرد تعيين جميع الوظائف، شغّل الأمر التالي:

بناء الجملة: shell

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

وبعد ذلك، انتقل إلى http://your_flask_endpoint:5000 حيث ينبغي أن يعمل تطبيقك. يجب أن تغيّر your_flask_endpoint إلى اسم DNS العام في مثيل EC2، كما فعلت في المتطلبات.

تتوفر ثلاث طرق: “/” و“/login” و “/logout”. ينبغي أن تزورها جميعًا وستتعرف على السلوك الأساسي.

الوقت اللازم لاستكمال الوحدة: 60 - 90 دقيقة


يستخدم المثال ملف تعريف ارتباط لتخزين اسم المستخدم. عندما تزور التطبيق للمرة الأولى، لن تجد اسم مستخدم مخزنًا في كائن الجلسة. عندما تنتقل إلى “/تسجيل الدخول” وتكتب اسم المستخدم، يتم تخزين القيمة في ملف تعريف ارتباط قيد تسجيل الدخول وتتم إعادة توجيهك إلى الصفحة الرئيسية. وإذا انتقلت إلى “/تسجيل الخروج”، تتم إزالة اسم المستخدم من الجلسة وتعود إلى النقطة التي بدأت منها.

ستوسع هذا التطبيق الأساسي باستخدام الجلسات من جانب الخادم، ولكن لنتأكد أولاً من أنك تستطيع الاتصال بـ Redis.



الخطوة 2.1

(انقر للتكبير)

الخطوة 2.1

في الأمثلة، ينبغي أن تستخدم اسم المضيف لنقطة النهاية الأساسية في كل مرة تُذكر فيها نقطة النهاية لـ Redis. 

الخطوة 2.2

(انقر للتكبير)

الخطوة 2.2

بناء الجملة: shell

$ export REDIS_URL="redis://your_redis_endpoint:6379"

بناء الجملة: shell

$ python

بناء الجملة: python

>>> import redis
>>> client = redis.Redis.from_url('redis://your_redis_endpoint:6379')
>>> client.ping()

**True**

إذا تعطل الأمر، فهذا يعني أنك محظور بواسطة إعدادات مجموعة الأمان. تحقق من وصول مثيل EC2 إلى مجموعة الأمان المعيّنة لمثيل ElastiCache. على سبيل المثال، لنفترض أن مثيل EC2 الخاص بك كان معيّنًا إلى مجموعة الأمان الافتراضية. يمكنك الآن تعديل مجموعة الأمان لمثيل Amazon ElastiCache وإضافة قاعدة TCP مخصصة للسماح بالاتصالات على منفذ 6379 من أي مثيل في مجموعة الأمان الافتراضية: 

الخطوة 2.5

في المصدر، يمكنك أن تبدأ كتابة اسم مجموعة الأمان وسيمكنك النقر فوق معرّف مجموعة الأمان. إذا كنت بحاجة لمعرفة المزيد حول مجموعات الأمان، فيمكنك إلقاء نظرة على المستندات أو مرجع قواعد مجموعة الأمان.


لنرجع إلى المثال. ستدخل الآن بعض التغييرات البسيطة التي ستتيح لك تخزين بيانات الجلسة في Redis. وفيما يلي المثال التالي الذي يتضمن تلك التغييرات:

بناء الجملة: 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('/')

الآن، يتم استيراد Redis وبدء تشغيله، وينتبه المؤشر إلى معايرة العداد وعرضه للمستخدم.

لاحظ أن أمر Redis الذي استخدمته لمعايرة العداد هو HINCRBY. وهذا لأنك تستخدم علامة تجزئة Redis لكل جلسة للمستخدم.


يمكنك الآن تعيين مدة صلاحية (TTL) للجلسة من جانب الخادم. وهو عبارة عن سطر إضافي من التعليمات البرمجية، ولن يتضمن هذا الجزء سوى الطريقة.

بناء الجملة: 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'
...

ستنتهي صلاحية المفتاح الذي تم تخزين الجلسة فيه في غضون 10 ثوان. مدة الصلاحية قصيرة جدًا، ولا تفيد إلا في هذا المثال. وإذا شغلت التطبيق الآن، فسترى كيف أن مؤشر الزيارات يحدث عداد الزيارات، ولكن إذا مرت 10 ثوانٍ بدون زيارة الصفحة، سيعود المؤشر إلى 1 في مرة التحديث التالية.


يكفي هذا المثال الموجز لتعلم أساسيات الجلسات من جانب الخادم، ولكن سيناريوهات العالم الواقعي ستكون مختلفة: فبدلاً من تخزين اسم المستخدم، ستنشئ رمز وصول وتخزنه بمجرد مصادقة المستخدم. وسيكون رمز الوصول هذا هو مفتاح Redis الذي ستخزَّن فيه جميع بيانات الجلسة من جانب الخادم. قد تحتاج أيضًا إلى استخلاص بعض السلوكيات الموضحة هنا، وبالتالي أي وصول إلى الجلسة من جانب الخادم سيحدث مدة الصلاحية بدون تدخل منك. في المستودع، سترى مثالًا يشرح فئة SessionStore التي تستخلص ذلك السلوك.