Pour comprendre l'idée de base qui guide la mise en cache de session côté serveur, vous implémenterez une petite application avec Flask, un microcadre pour le développement Web dans Python. Nous nous concentrerons sur les concepts, et pas sur les particularités d'un certain cadre et d'un certain langage. Vous pouvez traduire les exemples du cadre Web et du langage de programmation de votre choix.

Si vous souhaitez démarrer avec Flask, suivez les instructions d'installation et le guide de démarrage rapide.

Vous trouverez ci-dessous une application très basique, vous permet de vous connecter et de vous déconnecter :

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

Le reste des exemples se baseront sur cet extrait. Le code de l'ensemble des exemples est disponible dans ce référentiel.

Si Flask est installé chez vous et que vous souhaitez démarrer cette application, copiez le code vers un fichier appelé example-1.py. Vous devez ensuite exporter deux variables d'environnement : FLASK_APP doit être défini sur example-1.py, et SECRET_KEY doit être défini sur une chaîne aléatoire, par exemple Y0PJWblKsg1axM4fGW. Si vous avez besoin d'aide pour configurer les variables d'environnement, consultez le guide de démarrage rapide de Flask.

Une fois que tout est configuré, exécutez cette commande :

syntaxe : shell

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

Accédez ensuite à http://your_flask_endpoint:5000, où votre application devrait s'exécuter. Vous devez remplacer your_flask_endpoint par le nom DNS public de votre instance EC2, comme vous l'avez fait dans les exigences.

Il y a trois routes disponibles : « / », « /login » et « /logout  ». Explorez ces routes l'une après l'autre, et vous vous familiariserez avec le comportement de base.

Durée du module : 60 à 90 minutes


Les exemples utilisent des cookies pour stocker le nom de l'utilisateur. La première fois que vous visitez l'application, aucun nom d'utilisateur n'est stocké dans l'objet de la session. Lorsque vous accédez à « /login  » et que vous fournissez un nom d'utilisateur, la valeur est stockée dans un cookie signé et vous êtes redirigé vers la page d'accueil. Ensuite, si vous accédez à « /logout  », le nom d'utilisateur est supprimé de la session et vous revenez là où vous avez commencé.

Vous étendrez cette application de base avec des sessions côté serveur. Commençons toutefois par vérifier que vous pouvez vous connecter à Redis.



Étape 2.1

(Cliquer pour agrandir)

Étape 2.1

Dans les exemples, utilisez le nom d'hôte de votre point de terminaison principal chaque fois qu'un point de terminaison Redis est mentionné. 

Étape 2.2

(Cliquer pour agrandir)

Étape 2.2

syntaxe : shell

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

syntaxe : shell

$ python

syntaxe : python

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

**True**

Si l'affichage se fige, cela signifie que vous êtes bloqué par les réglages du groupe de sécurité. Vérifiez que votre instance EC2 a accès au groupe de sécurité assigné à votre instance ElastiCache. Imaginons par exemple que votre instance EC2 a été assignée au groupe de sécurité par défaut. Vous pouvez désormais modifier le groupe de sécurité de votre instance Amazon ElastiCache et ajouter une règle TCP personnalisée autorisant les connexions sur le port 6379 à partir de n'importe quelle instance dans le groupe de sécurité par défaut : 

Étape 2.5

Dans Source, commencez à saisir le nom du groupe de sécurité. Vous pourrez cliquer sur l'ID du groupe de sécurité. Si vous souhaitez en savoir plus sur les groupes de sécurité, consultez la documentation ou les règles de référence du groupe de sécurité.


Revenons à l'exemple. Nous allons maintenant effectuer quelques modifications mineures, qui vous permettront de stocker les données de la session dans Redis. Voici le deuxième exemple avec ces modifications :

syntaxe : 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 est désormais importé et initialisé, et l'index se charge de l'incrémentation d'un compteur et de l'affichage pour l'utilisateur.

Notez que la commande Redis que vous avez utilisée pour l'incrémentation du compteur est HINCRBY. Cela est dû au fait que vous utilisez un hachage Redis pour chaque session d'utilisateur.


Vous allez maintenant configurer une durée de vie pour la session côté serveur. Il s'agit simplement d'une ligne de code supplémentaire, et cet extrait inclura uniquement la route /.

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

La clé dans laquelle la session est stockée expirera dans 10 secondes. Cette durée de vie est très courte et est uniquement utile pour cet exemple. Si vous exécutez l'application maintenant, vous verrez comment les visites de l'index mettent à jour le compteur des visites. En revanche, si vous attendez 10 secondes sans visiter cette page, le compteur reviendra à 1 lors de la prochaine actualisation.


Ce bref exemple suffit pour apprendre les bases des sessions côté serveur, mais dans la réalité, vous procéderez autrement : au lieu de stocker le nom d'utilisateur, vous générerez et stockerez un jeton une fois que l'utilisateur est authentifié. Ce jeton représentera la clé Redis sous laquelle l'ensemble des données des sessions côté serveur sont stockées. Vous pouvez également éliminer certains des comportements présentés ici, afin que tout accès à la session côté serveur actualise la durée de vie sans votre intervention. Dans le référentiel, vous trouverez un exemple fournissant une classe SessionStore qui élimine ce comportement.