************************************************************ *** 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()