************************************************************
*** Python Environment Information

* Python      - we know it and love it
* Apache      - the defacto standard

* PyApache/mod_python

Either one is fine, the goal is to load all Python code once, before
Apache forks. Then, for every web-request, Apache just makes a
function call into the Python environment which serves the page. This
is "really fast" as it gets rid of all of the parsing and loading of
Python. Various versions of PyApache and mod_python have gained and
lost and gained again the ability to do this well. We used a hacked
version of PyApache way back when, I think mod_python does this out of
the box today.



************************************************************
*** Python Tools 

* CSPage.py

This is our "page rendering superclass". It's pretty simple and has
nice machinery for some of the stuff talked about on this list. For
example, it has nice debugging and redirect support, and it has a
mechanism for mapping form submit buttons to method names. Here is an
example of how the form stuff works:

 <form action="foo.py">
   <input type=submit name="Action.Foo" value="Do Foo!">
 </form>

 class MyPage(CSPage):
    def setup(self):
        # this runs before everything else
        pass
    def display(self):
        # this is a regular non-submission render
        pass
    def Action_Foo(self):
        # this is run automatically when the Foo submit button is clicked
        pass

* odb.py

This is an object to relational database mapping tool. It makes
interacting with SQL databases really easy. It gives you a place to
put all your SQL code. It also could be changed to work with flat
files as well. We have some nice hooks to connect this to Clearsilver,
so rendering database data into webpages is really easy. Here is an
example:

rows = mydb.mytable.fetchAllRows()        # fetch all rows
rows.hdfExport("CGI.tabledata",ncgi.hdf)  # export them into the dataset

# it is also really easy to change rows:

row = mydb.mytable.fetchRow( ('user', 'jeske') )
row.email = 'jeske at chat.net'
row.save()