apt-get install libapache2-mod-python /etc/init.d/apache2 force-reload apache2ctl restartNext grab the web.py framework from webpy.org. You can grab the tar or use easy_install depending on your setup.
wget http://webpy.org/static/web.py-0.33.tar.gz tar xzvf web.py.tar.gz cd web sudo python setup.py install # or if you use easy_install easy_install web.py
Download this file http://www.aminus.net/browser/modpython_gateway.py?rev=106&format=raw This python package can (with this version) go anywhere in your python path "sys.path". However, I placed it in the wsgiref directory. I'm running python2.6 so I did the following
# after downloading mv modpython_gateway.py /usr/lib/python2.6/wsgiref/modpython_gateway.pyIt's important to remember that in the VirtualHost file you create the PythonHandler directive will need to reference this module. If you place it outside of the wsgiref directory remember to change the directive as well.
python pcode.py 4567where the pcode.py is your web.py application filename and the 4567 is the port number you want to start the server on. I think it defaults to 8080. If you're running apache or another web server port 80 will be in use. This is where mod_python (or cgi or fastcgi) come into play.
<VirtualHost *> ServerName py.seanbehan.com DocumentRoot /var/www/python/myappAliases can trip you up! Pay attention here
Alias /myapp /var/www/python/myapp <Directory /var/www/python/myapp> <IfModule python_module> PythonPath "sys.path +['/var/www/python/myapp']" AddHandler python-program .py
modpython_gateway is a file you'll need to download and place in wsgiref
PythonHandler wsgiref.modpython_gateway::handler # This is your python program PythonOption wsgi.application pcode::main PythonOption SCRIPT_NAME /myapp PythonDebug on </IfModule> </Directory>
</VirtualHost>
import web #this is the web.py frameword web.webapi.internalerror = web.debugerror #lets capture errors for debuggingSave the file, reload apache and visit the location on the web (In my case py.seanbehan.com/pcode.py/). Remember to include that last "/" after the pcode.py. You might get a "not found" message from web.py otherwise.map paths to classes
urls = ( "/", "hello" )
this is the main from the PythonOption wsgi.application pcode::main from our VirtualHost
main = web.application(urls, globals()).wsgifunc()
class hello: def GET(self):
web.header... otherwise you'll be prompted to save the file rather than view it in the browser
web.header('Content-type','text/html') yield "Finally got web.py to work!"
if name == "main": main.run()
a2enmod rewriteYou can either set up the rewrite rules in your VirtualHost or in a .htaccess file. I'll do the .htaccess so I don't have to reload the server for the changes to take effect.
In the same directory as your pcode.py file create a file ".htaccess" and in it place this code
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} !^/icons RewriteCond %{REQUEST_URI} !^/favicon.ico$ RewriteCond %{REQUEST_URI} !^(/.*)+code.py/ RewriteRule ^(.*)$ pcode.py/$1 [PT] </IfModule>
Alias /myapp /var/www/python/myappThis will map incoming urls to the full path on the filesystem so that your python program will run properly. I kept getting the not found error message from web.py without it. There might be a better way to set this up but this is how I got it to work.
Here are some additional resources I found helpful http://wiki.slicehost.com/doku.php?id=install_mod_wsgi_on_ubuntu_gutsy http://webpy.org/install http://dready.org/blog/2009/01/29/webpy-with-mod_python-on-apache/ http://www.devisland.net/help/webpy.shtml
Just finishing up brewing up some fresh ground comments...