[mod_python] (more) Cookies trouble

Wouter van Marle wouter at squirrel-systems.com
Thu May 12 23:45:26 EDT 2005

Hi all,

Now the following issue, see the scripts below for demonstration of how
it "works" here.
test.py/home serves a simple home page, with two hyperlinks (linking
back to modules within test.py) and a button linking to
"testuser.py/register". Here also something goes wrong: the language
session does not persist.
testuser.register finds there is no session present (no attribute
'session' in req present), so calls back to main.get_session(req) to get
it's session. There the session should be opened, and if not found,
defaults read from the "basic" cookie that is set previously, it is set
with path "/python/test.py" according to Mozilla's cookie manager.
get_session(req) however now appears to be unable to read the "basic"
cookie, and returns the default value to testuser.register, instead of
the value read in the cookie.

------------------ BEGIN test.py
from mod_python import Cookie
from mod_python import Session

import time

def home (req):
    req.content_type = "text/html; charset=utf-8"
    username = ""
    if not hasattr(req, "session"):
        req.session = get_session(req)
    language = req.session["language"]
    # update the cookie on the user's side
    value = {"language": language, "username": username}
                      Cookie.MarshalCookie("basic", value, "gezellig",
                                           expires = time.time() + 7776000 # 90 days
    cookies = Cookie.get_cookies(req, Cookie.MarshalCookie,
                                 secret = "gezellig")
    req.write("found cookies: "+str(cookies)+"<br>")
    req.write("home got language: "+language+"<br>")
    req.write("Language switcher: <a href=./en>en</a>  <a href=./cn>cn</a><br>")
    req.write("""register: <form action="../../python/testuser.py/register" method="post"><input value="Register" name="Register" type="submit">""")

def en(req):
    if not hasattr(req, "session"):
        req.session = get_session(req)
    req.session["language"] = "en"

def cn(req):
    if not hasattr(req, "session"):
        req.session = get_session(req)
    req.session["language"] = "cn"

def get_session(req):
    # gets the current session, checks if complete, if not reads defaults from
    # the cookies.
    sess = Session.Session(req)
    req.content_type = "text/html; charset=utf-8"
    # read user's settings from their cookies
    language = "default" # system default
    cookies = Cookie.get_cookies(req, Cookie.MarshalCookie,
                                 secret = "gezellig")
    if cookies.has_key("basic"):
        # the basic info is stored in a cookie named "basic"
        basiccookie = cookies["basic"]
        if type(basiccookie) is Cookie.MarshalCookie:
                language = basiccookie.value["language"]
    sess["language"] = language
    return sess

------------------ END test.py

------------------ BEGIN usertest.py
from mod_python import apache
from mod_python import Cookie

test = apache.import_module("test")

def register (req):
    req.content_type = "text/html; charset=utf-8"
    if not hasattr(req, "session"):
        req.session = test.get_session(req)
    req.write("got cookies: %s <br>"% str(Cookie.get_cookies(req, Cookie.MarshalCookie, secret = "gezellig")))
    req.write("got language: %s <br>"% req.session["language"])

------------------ END usertest.py

More information about the Mod_python mailing list