Django: request.session-Variablen bei parallelen runservern

Django, Flask, Bottle, WSGI, CGI…
Antworten
robpy
User
Beiträge: 3
Registriert: Montag 21. März 2011, 10:13

Ich arbeite seit ein paar Jahren mit Python/Django und habe nun folgendes Phänomen:
auf einem lokalen Rechner laufen 2 verschiedene Projekte parallel mit den Portnummern 8000 und 8001, je mit einem eigenen runserver gestartet.
In den Templates ist eine Variable msg eingebaut, die ggf. Fehler anzeigen soll:

{% if msg %}
<h3 class="redink">{{ msg|linebreaksbr }}</h3>
{% endif %}

Geladen wird sie im Programm mit:

msg = u'...'
...
return render_to_response('....html',{
'msg': msg,...})

Je nach Steuerung soll aber dieses Template im Fehlerfall verlassen und zu einem übergeordneten Menu gesprungen werden. Um die Programmvariable msg nicht zu verlieren, rette ich sie vorher:

request.session['msg'] = msg

Und am Anfang der Menüroutine (oder anderer geeigneter Programme) lade ich sie am Anfang:

if 'msg' in request.session:
msg = request.session['msg']
else:
msg = u''

Das ist alles überhaupt kein Problem, aber wenn ich im Fehlerfall der 1. Anwendung in die 2. umswitche und dort eine Seite mit ebenfalls diesem Mechanismus betrete, wird mir dort die Fehlermeldung des 1. Projekts angezeigt.
Ist die Struktur request.session nicht eindeutig je runserver (Portnr.)? Python scheint lt. Taskliste mehrfach zu laufen.
Was kann man dagegen unternehmen? Ich habe schon erfolglos beide settings erweitert um

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
)

Ich arbeite mit Python 2.5 und Django 1.0 unter Windows XP, Phänomen tritt aber auch mit Python 2.6 unter Windows 7 auf.

Vielen Dank für etwaige Tipps
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ist die Struktur request.session nicht eindeutig je runserver (Portnr.)?
Nein, nur pro Domain. Du könntest das Problem allerdings umgehen, indem du verschiedene Browser-Instanzen öffnest, die verschiedene Cookies verwenden. Evtl. kann man auch mit SESSION_COOKIE_DOMAIN etwas anstellen - ich weiß allerdings nicht, ob da Portangaben gültig sind.
robpy
User
Beiträge: 3
Registriert: Montag 21. März 2011, 10:13

Ich habe 2 x den Browser geöffnet (umswitchen mit ALT+TAB ist schneller als die Registerkarte zu wechseln): das müssten doch 2 Instanzen sein!?
deets

Noe, das ist derselbe Browser. Am einfachsten duerften einfach zwei verschiedene Browser sein (Opera/FF oder FF/Chrome oder was auch immer..)
robpy
User
Beiträge: 3
Registriert: Montag 21. März 2011, 10:13

Problem geklärt (mit externer Hilfe):
die Datenbereiche werden tatsächlich per Browser zusammen gefasst. Das kann man fest stellen, wenn man Systemfelder wie request.session.session_key und os.getpid() andrucken lässt. Bei einem "richtigen" Server greifen Leute von verschiedenen Rechnern auf das Programm zu, wenn aber jemand mehrfach von seinem Gerät zugreift, werden die Daten nicht getrennt: in allen Browsern und Registerkarten ist (spätestens nach dem Refreshen der Seite) dieselbe PID zu sehen, lediglich die Session-ID ist von Browsertyp zu Browsertyp unterschiedlich. Also muss man verschieden Browser benutzen oder die Werte vom Programm aus woanders speichern (z.B. in einer Art User-DB).
Antworten