Django munkamenet kezelés

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.
22nov.

4 Comment for Django munkamenet kezelés

  1. RePa says:

    Koszi a cikket Bence!

    A tobbi olvaso is nyugodtan jelezze, ha kedvet erez hozza, hogy python/django temaju cikket irjon! :)

  2. janjen says:

    sziasztok, próbáltam az általad készített példákat kipróbálni és az InstantDjango hoz mellékelt példákat is, ami itt található:

    http://www.instantdjango.com/chapter1.html

    lépésről lépésre mentem végig a példákon, amikor a webszervert elindítom, akkor "0 errors found." üzenettel indul, viszont amikor a böngészőben meg akarom nyitni (bármelyik példát), akkor mindig ugyanazt a hibát kapom:

    NameError at /crime/arson name 'admin' is not defined Request Method: GET Request URL: http://localhost/crime/arson Django Version: 1.2.3 Exception Type: NameError Exception Value: name 'admin' is not defined Exception Location: C:djangodevcrimemap..crimemapurls.py in <module>, line 15 Python Executable: C:djangodevPython27python.exe Python Version: 2.7.0

    a te példáidnál ugyanezt a hibát kapom, az url.py-ben az admin rész elől elvettem a kommentet, a syncdb is lefutott rendben.

    MIt ronthatok el? Kell valami még az adminos részekhez?

    Köszönöm!

    • RePa says:

      Az urls.py elejen be van importalva az admin modul? (from django.contrib import admin)?

      Illetve ellenorizd azt is, hogy a settings.py-ben az INSTALLED_APPS listaban szerepeljen django.contrib.admin? (De az adott hiba inkabb az elso dologbol ered.)

      Ha tenyleg minden megvan, es nincs otleted, nyugodtan kuldd el nekem emailben a fileokat, amiket csinaltal, es atnezem oket. (repa kukac django pont hu elvileg nalam landol.)

  3. janjen says:

    Szia!

    Köszi a segítséget! Az volt a baj, amit az első mondatban írtál; nem volt beimportálva a "from django.contrib import admin" az urls.py-ben... A fura az, hogy egyik doksiban sem láttam, hogy ez kellene oda, mintha ez mindenkinek természetes lenne, de most már tudom :) Kösszi!

Szólj hozzá