A munkameneteket kezelő keretrendszer (session framework) lehetőséget ad arra, hogy tetszőleges információkat tároljunk egy adott munkamenetben (session-ben).
A rendszer az adatokat - a kliens oldali sütik helyet - szerever oldalon tárolja az adatbázis egy táblájában (
django_session
). A sütik csak a munkamenet azonosítóját tárolják (kódolt formátumban), ez védi meg az alkalmazást attól, hogy az adatokat kliens oldalon a felhasználók módosíthassák. Először is engedélyezzük a munkamenetek kezelését. A következő beállításokat kell tartalmaznia a
settings.py
állománynak:
- A MIDDLEWARE_CLASSES résznél a következő bejegyzést:
'django.contrib.sessions.middleware.SessionMiddleware'
- Az INSTALLED_APPS résznél a következő bejegyzést:
'django.contrib.sessions'
Ha ezt a két bejegyzést fölvettük, nem kell mást tennünk, mint szinkronizálni az adatbázist (manage.py syncdb). Mivel a munkamenet kezelés egy általános feladat szinte minden webes alkalmazás esetén, ezért a startproject parancs ezeket a beállításokat alapértelmezettként megcsinálja.
Ezek után minden HttpRequest objektum tartalmaz egy session attribútumot. Ezen attribútum értékeit ugyanúgy lehet kezelni, mint a szótár típusú változókat (kulcs-érték párok alapján):
# Munkamenet egy értékének beállítása:
request.session["fav_color"] = "blue"
# Értékadás egy változónak a munkamenet egy értéke alapján:
fav_color = request.session["fav_color"]
# Egy elem törlése a munkamenetből:
del request.session["fav_color"]
# Annak ellenőrzése, hogy a munkamenet tartalmaz-e
# egy bizonyos kulcs-érték párt:
if "fav_color" in request.session:
....
Ezen felül a session attribútum rendelkezik a
keys()
és az
items()
függvényekkel. Van néhány egyszerű szabály a munkamenetek adatainak kezelésével kapcsolatban:
- A szótár kulcsai string típusú objekumok legyenek.
- A Django keretrendszer is használ néhány szótár értéket. Ezeknek a kulcsai kivétel nélkül aláhúzással kezdődnek. Amíg nem vagyunk tisztában az összes "Django-s" szótárkulccsal, addig nem érdemes olyan kulcsokat használni saját bejegyzéseinknek, melyek aláhúzással kezdődnek.
- Nem szabad a session objektumot bármilyen más objektumra cserélni, vagy annak attribútumait módosítani:
request.session = valami_mas_objektum # Helytelen használat!
request.session.foo = 'bar' # Helytelen használat!
Nézzünk egy egyszerű példát arra, hogy hogyan lehet megelőzni azt, hogy egy felhasználó egy poszthoz több megjegyzést is fűzzön egy látogatás alkalmával (azaz egy munkameneten belül):
def megjegyzest_kuld(request):
if request.method != 'POST':
raise Http404('....')
if 'megjegyzes' not in request.POST:
raise Http404('.....')
if request.session.get('kuldott_korabban', False):
return HttpResponse("Mar kommenteltel korabban.")
# Megjegyzes elmentése
request.session['kuldott_korabban'] = True
return HttpResponse('Koszonom a megjegyzest!')
A Django munkamenet keretrendszer segítségével tehát lehetőséget teremtettünk arra, hogy adatokat tároljunk több HTTP lekérdezésen keresztül (perzisztencia). Ez az alapja (többek között) a felhasználói azonosításnak és jogosultság kezelésnek.