Sunucu tarafı oturumu önbelleğe alma işleminin ardındaki temel amacı anlamak amacıyla Python’da web geliştirme için bir mikro çerçeve olan Flask’ı kullanarak küçük bir uygulama yürüteceksiniz. Odak, belirli bir durumun ve dilin özelliklerinden ziyade kavramlar üzerinde olacağı için örnekleri istediğiniz web çerçevesi ve programlama dilinde çevirebilirsiniz.

Flask’ı kullanmaya başlamak istiyorsanız yükleme talimatları vehızlı başlangıç kılavuzunu takip edin.

Aşağıda, giriş ve çıkış yapmanızı sağlayan çok temel özelliklere sahip bir uygulama vardır:

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

Örneklerin kalanı bu kod parçacığa bağlı olacaktır. Tüm örnekler için kodları bu depoda bulabilirsiniz.

Eğer Flask yüklüyse ve bu uygulamayı önyükleme yapmak istiyorsanız kodu, example-1.py adlı bir dosyaya kopyalayın. Daha sonra iki ortam değişkenini dışarı aktarmanız gerekmektedir: FLASK_APP, example-1.py koduna ayarlanmalı ve SECRET_KEY ise Y0PJWblKsg1axM4fGW gibi rastgele bir dizeye ayarlanmalıdır. Ortam değişkenlerini ayarlamada yardıma ihtiyacınız olursa Flask’ın hızlı başlangıç kılavuzuna başvurabilirsiniz.

Tüm ayarları yaptığınızda aşağıdaki komutu çalıştırın:

syntax: shell

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

Daha sonra uygulamanızın çalıştığını görebileceğiniz http://your_flask_endpoint:5000 adresine gidin. Gerekliliklerde yaptığınız gibi your_flask_endpoint’u (flask_ uç _noktanızı) EC2 bulut sunucunuzun Public DNS adı ile değiştirin.

Üç rota vardır:“/”, “/login”, ve “/logout”. Sırayla tümünü deneyin ve temel davranışa alışın.

Modülü Tamamlama Süresi: 60 - 90 Dakika


Örnek, bir kullanıcı adını depolamak için çerez kullanmaktadır. Uygulamayı ilk ziyaret ettiğinizde oturum nesnesinde depolanmış bir kullanıcı adı olmaz. “/login”e gidip kullanıcı adı girdiğinizde değer işaretli bir çerezde depolanır ve giriş sayfasına yönlendirilirsiniz. “/logout”a gittiğinizde kullanıcı adı oturumdan kaldırılır ve başladığınız yere geri dönersiniz.

Bu temel uygulamayı sunucu tarafı oturumlar ile genişleteceksiniz ancak ilk önce Redis’e bağlanabileceğinizden emin olalım.



2.1. Adım

(Büyütmek için tıklayın)

2.1. Adım

Örneklerde her Redis uç noktasından bahsedildiğinde Birincil Uç Noktanızın konak adını kullanmalısınız. 

2.2. Adım

(Büyütmek için tıklayın)

2.2. Adım

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

Donarsa Güvenlik Grubu ayarları tarafından engellendiğiniz anlamına gelmektedir. EC2 bulut sunucunuzun, ElastiCache bulut sunucunuza atanan güvenlik grubuna erişimi olduğunu doğrulayın. Örneğin, EC2 bulut sunucunuzun varsayılan güvenlik grubuna atandığını varsayalım. Amazon ElastiCache bulut sunucunuzun güvenlik grubunu değiştirebilirsiniz ve varsayılan güvelik grubundaki herhangi bir bulut sunucusundan 6379 numaralı bağlantı noktasında bağlantıya izin veren Özel bir TCP kuralı ekleyebilirsiniz: 

2.5. Adım

Kaynak’ta güvenlik grubunun adını yazmaya başladıktan sonra Güvenlik Grubu Kimliğine tıklayabileceksiniz. Güvenlik Grupları hakkında daha fazla bilgi almanız gerekirse belgeyi veya Güvenlik Grubu Kuralları Rehberini inceleyebilirsiniz.


Hadi örneğe geri dönelim. Redis’de oturum verilerini depolamanıza izin veren birtakım küçük değişiklikleri tanıtacaksınız. Bu değişikler ile ikinci örnek şöyledir:

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

Redis şimdi aktarılmış ve başlamış durumda; dizin ise bir sayacın arttırılması ve kullanıcıya gösterilmesiyle ilgilenmektedir.

Sayacı arttırmak için kullandığınız Redis komutunun HINCRBY olduğunu unutmayın. Bunun sebebi her kullanıcı oturumu için bir Redis karması kullanmanızdır.


Şimdi sunucu tarafı oturumuna bir Yaşam Süresi (TTL) ayarlayacaksınız. Bu sadece bir satır daha fazla kod demektir ve bu kod parçacığı yalnızca / rotasını içerecektir.

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

Oturumun depolandığı anahtarın süresi 10 saniye içerisinde dolacaktır. Bu çok kısa bir TTL’dir ve sadece bu örnek için kullanışlıdır. Uygulamayı şimdi çalıştırırsanız dizinin ziyaret edilmesinin Ziyaretler sayacını nasıl güncellediğini göreceksiniz. Ancak bu sayfayı ziyaret etmeden 10 saniyenin geçmesine izin verirseniz bir sonraki yenilemede sayaç tekrar 1’e gelecektir.


Bu kısa örnek, sunucu tarafı oturumlar hakkında temel bilgileri edinmek için yeterlidir ancak bir gerçek dünya senaryosunda başka bir şey yapacaksınız: kullanıcı adını depolamak yerine bir kullanıcı doğrulandığında bir belirteç oluşturup depolayacaksınız. Bu belirteç,tüm sunucu tarafı oturumu verilerinin depolanacağı Redis anahtarını temsil edecektir. Sizin müdahaleniz olmadan sunucu tarafı oturumuna yapılan herhangi bir erişimin TTL’yi yenilemesi için burada verilen davranışların bazılarını soyutlamak isteyebilirsiniz. Depoda, bu davranışı soyutlayan bir OturumDeposu sınıfı sağlayan bir örnek bulacaksınız.