Pytanie:

Jestem w trakcie przenoszenia moich {x0}} aplikacji z wybudowanego serwera do Apache2 przy użyciu mod_wsgi. Wszystko jest w porządku, a kodeks wykonuje, z wyjątkiem sesji.

Po pierwsze, pamiętaj, że sesje działają dobrze ze starym serwerem. Testuję w następujący sposób: Renderuję stronę o nazwie layout, która ma linie

$session
${'loggedIn' in session}

Ze względu na fakt, że session (który jest web.sessions.Session) jest inicjowany z initializer={'loggedIn' : False}, spodziewam się, że druga linia zawsze renderuje jako "prawdziwa". To robi z serwerem domyślnym.

Jednak na Apache2 z MOD_WSGI tak nie jest. Jeśli ponownie uruchomię Apache, to sprawia, że jest to prawdziwe, ale kolejne odświeżanie strony renderują jako false.

Rozumiem, że czasami cookie_path może być winpritem, ale ustawiono to do / i nie jestem pewien, co jeszcze może być problemem.

Kod:

/etc/apache2/apache2.conf

LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias / /var/www/myapp/webUtils.py/
AddType text/html .py
<Directory /var/www/myapp>
        Order deny,allow
        Allow from all
</Directory>

/var/www/myapp/webUtils.py

import sys,os
abspath = os.path.dirname(__file__) or '.'
sys.path.append(abspath)
os.chdir(abspath)

import web
(...)

## The configuration for the sessions (this function just reads in 
## the file and turns it into a dictionary).
session_configuration = config.getConfiguration('config/sessions.cfg')

for i in session_configuration:
  web.config.session_parameters[i] = session_configuration[i]

web.config.debug = False

app = web.application(urls,globals(),autoreload=False)

session = web.session.Session(app, 
                              web.session.DiskStore('/home/robert/sessions'),
                              initializer={'loggedIn' : False})

render = web.template.render('templates',
                             globals={'session':session},
                             base='layout')

# Get the WSGI stuff
application = app.wsgifunc()

config/sessions.cfg

timeout : 60*10
secret_key : "stuff"
cookie_name : "someName"
cookie_path : "/"

Edytuj: Aktualizacja

Uruchamiając wyczerpujące testy, znalazłem to, że dzwoniąc webUtils.session._load() jako pierwszej linii w GET rozwiązuje cały problem. W ten sposób postulować, że _processor tego Session nie jest nazywany (nawet jeśli jest w app.processors). Dlaczego nie jest nadal tajemnicą.

0
rspencer 17 sierpień 2014, 18:50

2 odpowiedzi

Najlepsza odpowiedź

W końcu znalazł problem. Musiał zrobić z procesami multi, ale skończyło się, że obiekt Session, który utworzył hak (a zatem został załadowany za każdym razem) nie był taki sam jak obiekt, który widział mój kod strony. Tak więc, jeśli i load ed i saved moja sesja w każdym GET oświadczenia i usunęła hak, wszystko działa.

Aby rozwiązać to, po prostu musiałem cofnąć założenie, które wykonałem i przywróciłem kod

if web.config.get('_session') is None:
    session = web.session.Session(app, web.session.DiskStore('sessions'), {'count': 0})
    web.config._session = session
else:
    session = web.config._session

Które usunięłem, ponieważ jest to podane tylko dla wbudowanego serwera w dokumentacji.

0
rspencer 19 wrzesień 2014, 04:48

Używasz konfiguracji wielu procesów, więc nie można polegać na pamięci podręcznej sesji pamięci, ponieważ kolejne żądania mogą przejść do różnych procesów. Ponadto, ponieważ używając wbudowanego trybu MOD_WSGI, Apache może zdecydować się na wyłączenie procesów, jeśli uważa, że nie są już potrzebni.

Musisz upewnić się, że używasz bazy danych dla pamięci podręcznej sesji.

Alternatywa przy użyciu trybu Daemon Mod_WSGI z domyślnym procesem.

0
Graham Dumpleton 18 sierpień 2014, 00:51