[albatross-users] Session management how-to?
Dave Kuhlman
dkuhlman at cutter.rexx.com
Thu Jun 20 13:02:34 EST 2002
Andrew -
>
> Does that help?
Yes it did. Thanks much. I don't quite have the intuitions for
the Albatross process model down yet. Your message, notes,
comments are helping quite a bit. I've got my simple stuff
working. Tomorrow, I'm on to something a bit more complex and
challenging.
I'm also writing up a few notes, as I learn things, on how-to do
things in Albatross. I've attached what I've done so far below.
This is preliminary, needless to say; I'm still learning Albatross.
But, if you you have any comments, I'm interested. And, if you
should feel that this would be of use to other Albatross users
(after a bit more work, of course), let me know.
- Dave
=============================================================
Albatross How-to for Beginners
Contents:
* Introduction
* How-to Structure an Object-based Application
* How-to Pass a Value to the Presentation
* How-to Pass a Value to the Controller
* How-to Manage Sessions
Back to top
_________________________________________________________________
Introduction
This document explains how to do a number of simple tasks with
Albatross. It is hoped that it will get a beginning Albatross user
past a number of early questions and problems so that s/he can move on
to more complex tasks.
Back to top
_________________________________________________________________
How-to Structure an Object-based Application
This section describes the structure of an object-based application.
It can be used as a "template" for creating an application.
An object-based application is one
1. Create the presentation -- Create an HTML file for each page. This
is the Albatross template file.
2. Create the controller -- Create a Python script. This script will
contain the following items:
3. Import the needed Albatross classes. For an object-based
application, the following are appropriate:
from albatross import SimpleSessionApp, SessionAppContext
4. Define a class for each page in the application. Here is a sample:
class Page2:
name = 'page2'
def page_process(self, ctx):
if ctx.req_equals('button_1'):
if ctx.get_value('next_page') == 'page3':
ctx.set_page('page3')
o
o
o
def page_enter(self, ctx):
o
o
o
def page_leave(self, ctx):
o
o
o
def page_display(self, ctx):
o
o
o
ctx.run_template('page2.html')
5. Define a context class as a subclass of SessionAppContext. Here is
a sample:
class AppContext(SessionAppContext):
def __init__(self, app):
SessionAppContext.__init__(self, app)
6. Define an application class as a subclass of SimpleSessionApp. The
constructor should call the constructor of the superclass and
register each page (class) in the application. Also provide a
create_context method that creates and returns an instance of your
context class. Here is an example:
class App(SimpleSessionApp):
def __init__(self):
SimpleSessionApp.__init__(self,
base_url = 'dispatch.py',
template_path = '.',
start_page = 'page1',
secret = 'tomato',
session_appid = 'sampleapp')
for page_class in (Page1, Page2, Page3):
self.register_page(page_class.name, page_class())
def create_context(self):
return AppContext(self)
7. Create the "main" script. Here is a sample:
if __name__ == '__main__':
app = App()
app.run(Request())
Back to top
_________________________________________________________________
How-to Pass a Value to the Presentation
This technique enables you to pass a value from the controller (the
Python script) to the presentation (the HTML file/template).
1. In the controller (i.e. in the Python script), add the value to
the the locals in the context. Here is a sample of the
page_display method in the class defined for the page:
class Page1:
name = 'page1'
def page_display(self, ctx):
ctx.locals.variable_1 = 'a sample value'
ctx.locals.variable_2 = 'another value'
ctx.run_template('page1.html')
2. In the presentation (i.e. the HTML page), use an Albatross tag to
"capture" the value from the context. Here is a sample tag:
<p>Value #1: <al-input type="TEXT" name="variable_1"></p>
<p>Value #2: <al-value expr="variable_2"></p>
Back to top
_________________________________________________________________
How-to Pass a Value to the Controller
This technique enables you to capture input from the presentation
(i.e. from the end-user at the Web browser) and pass those values back
to the controller (the Python script).
1. Add "input" items to the presentation (the HTML template):
<p>Enter your name: <al-input type="TEXT" name="user_name"></p>
<p>Enter your name: <input type="TEXT" name="user_phone"></p>
Note that the first item (user_name) allows you to pass a value to
the presentation from the controller. The second item (user_phone)
does not.
2. Capture the entered values in the controller. Here is a sample
page_display method:
class Page2:
name = 'page1'
def page_display(self, ctx):
ctx.run_template('page1.html')
user_name = ctx.locals.user_name
user_phone = ctx.locals.user_phone
# Do something with user_name and user_phone.
o
o
o
Back to top
_________________________________________________________________
How-to Manage Sessions
1. How-to create a session -- Albatross does this for you
automatically. If the request from the browser contains
information about an existing session, that session is used,
otherwise Albatross creates a new session.
2. How-to remove a session -- You will need to explicitly do this.
(Albatross does not do this automatically.) If you have a page
from which the application can go no further, you could remove the
session on entering the page (the user will never leave the page -
but reloading the page will take them back to the beginning). Here
is an example:
class FinalPage:
def page_enter(self, ctx):
ctx.remove_session()
Or, if the final page of your application contains a "Logout" or
"Exit" button, you can remove the session in the page_process
method of the class for that page like this:
class FinalPage:
def page_process(self, ctx):
# Check for the logout button.
if ctx.req_equals('logout'):
ctx.remove_session()
# Send the user back to the login page.
ctx.set_page('login')
3. How-to save session state across pages within the application --
In order to direct Albatross to do this, you will "register" the
variables that you want saved. Do this by calling
add_session_vars, passing the names of the variables to be saved.
Here is an example:
class Page1:
def page_enter(self, ctx):
ctx.add_session_vars('user_name', 'user_phone')
Additional notes on session management:
* In order to run a session based application, you must start-up an
Albatross session server. The session-server sub-directory in the
Albatross distribution, contains an implementation of a session
server (al-session-daemon).
* If your application inherits it context and application classes
from SimpleSessionApp and SessionAppContext then Albatross stores
and saves session information in files in the local file system.
* In contrast, if your application inherits it context and
application classes from SimpleSessionFileApp and
SessionFileAppContext then Albatross stores and saves session
information in the session server, i.e. in memory in the session
server daemon. Note that if you change from memory-based session
storage to file-based storage, you will need to modify the call to
the application super class (). Add the session_dir keyword
argument, with the directory (a string) where you want Albatross
to store session state.
_________________________________________________________________
--
Dave Kuhlman
dkuhlman at rexx.com
http://www.rexx.com/~dkuhlman
More information about the Albatross-users
mailing list