İçeriğe geç

Django Session Yönetimi

Giriş.

Web geliştirme dünyasında, kullanıcı bazlı bilgileri saklayabilme adına session ve cookie kavramları önemli iki kavramdır.

Bildiğimiz üzere, web HTTP protokolünü baz alarak çalışır. HTTP protokolü ise, durumsuz (stateless) bir protokoldür. Bunun bir sonucu olarak oluşturulan HTTP istekleri bir örgüyle birbirlerine bağlı değildir.

n numaralı bir isteğin n+1 ya da n-1 numaralı istek ile bir bağıntısı bulunmaz. İstekler arası veri alışverişi bulunmaz. Her istek içerdiği veriyle ayrık değerlendirilir. Buda HTTP’nin basit ve hafif olmasını sağlar.

Ancak tüm isteklerin birbirinden bağımsız olması, örgün bir şekilde bilgi taşınmaması her zaman istenen bir durum değildir.

Örneğin bir e-ticaret uygulamasında kullanıcının sepeti her yeni ziyaret ettiği sayfada sıfırlanmamalı, yada giriş sayfasından bilgilerini doğruladığımız bir kullanıcımızın sadece giriş yapmış kullanıcıların görebileceği bir sayfaya erişebilmesi hemen her gün karşılaşılan isterlere örnek gösterilebilir.

İşte bu noktada, bir kaç teknik kullanılarak bu durumsuzluk ilkesi aşılarak istekler arası bilgi alışverişi sağlanabilir. Bugün bu tekniklerden olan cookie ve session kavramlarına göz atacağız. Sonrasında Django’nın sessionları nasıl yönettiği ve Django tabanlı uygulamalarda nasıl kullanabileceğimize göz atacağız.


🍪 Cookie nedir?

Cookie’ler ya da Türkçe ismiyle çerezler, kullanıcının tarayıcısında saklanan bilgi kümeleridir. Çerezler web uygulamaları tarafından, tarayıcıya gönderilir. Gönderilen cookie’leri tarayıcı bir sonraki isteğinde sunucuya geri gönderir. Bu, web sitelerinin kullanıcıları tanımasına, tercihlerini hatırlamasına ve kişiselleştirilmiş deneyimler sunmasına olanak tanır.

Aşağıdaki görsel örnek bir tarayıcıda saklanan cookie’leri görebiliriz.

cookies on web browser storageHer istekte, saklanan cookie’ler sunucuya gönderilerek, bağıl işlem gerçekleştirilebilmesine ve bilgi alışverişine olanak sağlar.

Ne var ki bu yöntem; hassas bir veri saklanacağı zaman bazı güvenlik sorunlarını yada istekler arası transfer edilecek verinin boyutu büyüdükçe tarayıcı limitine takılınma, basit ve hafif olan HTTP protokolünün ağırlaşma olasılığını doğurur.

  • Çerezlerin istemci tarafında tutulması, kötü niyetli kişilerin çerezlere erişebilmesine ve bunları okuyabilmesine olanak tanır. Bu durum, kullanıcı kimlik bilgileri, oturum anahtarları gibi hassas verilerin çalınma riskini artırabilir.
  • Çerezlerin doğru bir şekilde şifrelenmemesi durumunda, bu verilere yetkisiz erişim sağlanabilir. Bu nedenle, HTTPS kullanımı önemlidir.
  • Çoğu tarayıcı, bir uygulamanın 4 kb ve üstü cookie tutmasını ya da bir alan adının üzerinde maksimum 30 cookie barındırılmasını sınırlar.

Dolayısıyla cookie üzerinde istekler arası veri alışverişinde bulunulacağında bu kullanım olabildiğince basit olmalı ve riskli bir veri barındırmamalıdır.

Cookie kavramından sonra session kavramına geçebiliriz.


Session nedir?

Session yada Türkçe ismiyle oturum 👩🏻‍💻 kullanıcı bazlı verilerin, sunucu tarafında tutularak, birbirini takip eden isteklerin birbirleriyle ilişkilendirilmesini sağlayan bir mekanizmadır.

Bu ilişkilendirme, kullanıcı sisteme giriş yaptığı anda başlayıp, kullanıcı sistemden çıkış yapana kadar yada uygulama geliştiricilerinin bir oturum için belirlediği maksimum yaşam süresi aşılana kadar devam edecektir.

Nasıl çalışır?

Adım adım inceleyecek olursak;

  • Kullanıcı sisteme giriş yaptığında, sunucu tarafından bir session başlatılır. Bu session, kendisini belirten benzersiz bir anahtara sahiptir ve genellikle “Session ID” olarak adlandırılır.
  • Sunucu, bu benzersiz anahtarı (Session ID) çoğunlukla cookie’ler üzerinden kullanıcının tarayıcısına gönderir.
  • İstemci (kullanıcı cihazı), her bir isteğini gönderirken bu session ID değerini sunucuya geri gönderir.
  • Sunucu, aldığı session ID’yi kullanarak, istekte bulunan istemciye ait benzersiz session nesnesini kendi oluşturmuş olduğu session nesneleri arasında bulmaya çalışır.
  • Eşleme sonucunda, session üzerindeki veriler kullanılabilir hale gelir ve istekler arası bağlantı kurulmuş olur.

Bu süreç, kullanıcı sistemden çıkış yapana kadar veya session için belirlenen yaşam süresi dolana kadar devam eder.

Session ve cookie kavramlarını genel olarak inceledikten sonra artık Django ile geliştirdiğimiz bir uygulamada session yönetiminin nasıl yapılabileceği konusuna devam edebiliriz.


Django ile session yönetimi.

Django yerleşik olarak bir session yönetim uygulamasına sahiptir. Bu uygulama doğrulanmış yada anonim kullanıcıların session’larını yönetmek tam destek sağlar.

Django ekosistemideki çoğu uygulama gibi bu uygulama da yine plugabble bir yapıda olduğundan ötürü, kurulumu için proje üzerinde temel bir kaç ekleme yada kontrol yapmamız gerekmekte.

Not olarak; yeni bir Django projesi başlattığınızda aşağıdaki ayarlar ön tanımlı olarak bulunmaktadır.

1.

django.contrib.sessions uygulaması INSTALLED_APPS içerisine ekli olmalı.

Bu uygulamanın eklenmesiyle birlikte; Django, projenize Session modeli ekleyecek ve bu modelin sütunlarını ise session_key, session_data ve expire_date alanları oluşturacak.

2.

django.contrib.sessions.middleware.SessionMiddleware middleware’i MIDDLEWARE listesine ekli olmalı.
Bu middleware, her HTTP isteği için session yönetimini sağlar ve verileri işler.

Varsayılan olarak Django session verilerini veritabanı üzerinde saklar. Bu ayar settings.py

içerisinde SESSION_ENGINE ayarıyla yönetilir.

Farklı saklama yöntemleri de desteklenmektedir; örneğin, cache mekanizması, dosya sistemi üzerinde veya istemci tarafında şifrelenmiş olarak saklanabilir.


Session’ların view üzerinde kullanımı.

Aşağıdaki gibi örnek bir view’a sahip olduğumuzu düşünelim;

class ApplicantVoteView(View):
    def post(self, request, applicant_pk,  *args, **kwargs):
        if request.session.get('has_voted', False):
            return HttpResponse('You already have voted.')
        ...
        # voting logic
        ...
        request.session["has_voted"] = True
        return HttpResponse('Your vote is recorded. Thank you.')

SessionMiddleware etkinleştirildiğinde, her HttpRequest nesnesinin üzerine otomatik olarak bir session niteliği atanır.

Bu nesne bir sözlük gibi davranır ve oturum verilerini içerir. Request nesnesi üzerinden, view’ın herhangi bir anında erişilerek bir sözlük gibi değişime uğratılabilir ya da tutulan bir veri okunabilir.

Session nesnesi, varsayılan bir sözlüğün sahip olduğu tüm metodlar ve birtakım özel metodlara sahiptir.


# yeni bir değer eklenmesi
request.session["key"] = "value"
# varolan bir session verisinin güncellenmesi
request.session["key"] = "modified"
# session nesnesi üzerinden bir verinin silinmesi
del request.session["key"]
# session nesnesi üzerinde tutulan tüm verilerin anahtarlarının alınması.
keys = request.session.keys()
# session nesnesi üzerinde bulunan bir verinin anahtara bağlı olarak kaldırılması, 
# bulunamaması durumunda varsayılan değerin geri döndürülmesi
request.session.pop('fav_color', 'blue')

Özel metodlardan en çok kullanımda olanlarından bazıları;

flush

Mevcut bir session üzerindeki tüm veriyi ve session cookie’sini kaldırır. Örneğin, Django’nun yerleşik kullanıcı doğrulama mekanizmasında logout işlemi sırasında kullanılır. Böylelikle farklı bir istemcinin session id elinde bulunsa dahi, önceki oturuma ait verilerin kullanılmasının önüne geçer.

set_test_cookie

test_cookie_worked

delete_test_cookie

Nadir olsada istemci cookie kabul etmeyecek bir yapılandırmaya sahip olabilir. Bu durumda session mekanizması doğru çalışamayacagından, bir test senaryosu geliştirilerek kullanıcının bir sonraki işleme devam edememesi ve cookie kabulüne yönlendirilmesi yukarıdaki üç metodla sağlanabilir. Örneğin;


class DashboardLoginView(View):
    def get(self, request, *args, **kwargs):
        request.session.set_test_cookie()
        return render(request, "dashboard_login.html", {})
    def post(self, request, *args, **kwargs):
        if request.session.test_cookie_worked():
            request.session.delete_test_cookie()
            ...
            # run dashboard login process
            ...
        else:
            return HttpResponse("Please enable your cookies.")

SessionMiddleware.

Buraya kadar bir session nesnesiyle nasıl etkileşebileceğimizden bahsettik fakat asıl işi yapan middleware üzerine de konuşarak hakimiyet seviyemizi arttıracak ve sonrasında göz atacağımız session aslında ne zaman değişir, kaydedilir ve istemciye ne zaman bildirilir  konusuna bir taban hazırlayacağız.

https://github.com/django/django/blob/main/django/contrib/sessions/middleware.py#L12

process_request

Request nesnesiyle birlikte gelen cookie’ler arasında session id olarak kullanılan keyi arar.

Bu key varsayılan olarak sessionid‘dir SESSION_COOKIE_NAMEsettingsiyle değiştirilebilir.

Sessionstore üzerinden ilgili engine kullanılarak(varsayılan veritabanı) session nesnesini request nesnesiyle ilişkilendirir.

process_response

Öncelikle, oturum nesnesinin kullanılıp kullanılmadığı ve değişip değişmediği kontrol edilir.

Eğer cookiler arasında sessionid değeri varsa ve oturum tamamen boşsa (kullanılmıyorsa), HttpResponse üzerindeki delete_cookie metodu kullanılarak oturum çerezi istemciden kaldırılır ve istemci bilgilendirilir.

Aksi durumda (session kullanılıyorsa), oturum verisi kaydedildikten sonra istemciye çerezler aracılığıyla bilgi verilir.

Session ne zaman kayıt edilir?

Varsayılan olarak Django sessionları sadece ilk oluşturulduğu ve değişime uğradığında kayıt eder ve istemciye döner.

Aşağıdaki kod bloğunu inceleyecek olursak;


# Session degisti.
request.session["foo"] = "bar"
# Session degisti.
del request.session["foo"]
# Session degisti.
request.session["foo"] = {}
# Session nesnesi değişmedi, 
# onun yerine içeride bulunan foo key'inin işaret ettiği sözlük değişti.
request.session["foo"]["bar"] = "baz"

Dolayısıyla son satırdaki değişim, istemciye bu haliyle bildirilemez. Bu örnekte olduğu bir nested değişim ya da session’ın değiştiğini mutlaka istemciye bildirmemiz gereken bir senaryoya sahipsek

request.session.modified = True

olarak değişimi işaretleyebiliriz.

Değişime uğrayan session yeni geçerlilik süresi ile istemciye bildirilecektir dolayısıyla modified işaretlemesi, doğru bir geçerlilik süresi yönetimi için önemlidir.

Bu yönetimi yapmak istemiyorsanız ve her istek-cevap döngüsünde session’ın kayıt edilmesini sağlamak isterseniz SESSION_SAVE_EVERY_REQUEST settings’ini True olarak değiştirebilirsiniz.


Kapanış.

Sonuç olarak, web geliştirmenin temel kavramlarından olan cookie ve session, kullanıcı deneyimini kişiselleştirmek ve durumları takip etmek için önemli kavramlardır. Cookie’lerin istemci tarafında tutulması ve session’ların sunucu tarafında yönetilmesi, web uygulamalarını daha etkileşimli ve özelleştirilmiş hale getirir. Django’nun yerleşik session yönetimi, bu süreci kolaylaştırır ve kullanıcı verilerini güvenli bir şekilde saklar.

Umarım faydalı olmuştur. Görüşmek üzere!

Django session dökümantasyonu.

 

Tarih:Blog

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Göster
Gizle