Jorey Bump
list at joreybump.com
Tue Mar 25 08:55:02 EDT 2008
Dominique.Holzwarth at ch.delarue.com wrote, at 03/25/2008 05:37 AM: > I've got some problems with importing modules from packages when using > mod_python. > Currently I'm using the Publisher Handler which is configured like this: > > <Directory "C:\Program Files\Apache Software > Foundation\Apache2.2\htdocs\python"> > AddHandler mod_python .py > PythonHandler mod_python.publisher > PythonDebug On > </Directory> > > My directory structure looks like this > > python/ > main.py > database/ > __init__.py > common.py The new importer in mod_python will ignore packages in the published directory and does not automatically add this location to the path when it falls back to the regular Python importer. In a nutshell, avoid trying to publish packages. There are other ways to include your package in the Python path. In fact, yours is a good candidate, since I'm guessing you have included database connection credentials, which you should NEVER put in your DocumentRoot. Any number of scenarios could result in your credentials being exposed. I create many of my mod_python applications as packages, and simply publish a wrapper that imports one or two functions from the package. In my virtual host configuration, I add the directory that contains all of my packages to the path: PythonPath "['/var/www/www.example.com/python'] + sys.path" Note that this directory is outside the DocumentRoot, which might be: /var/www/www.example.com/site So, for a specific directory, the resulting configuration might be: # Set Python path for entire virtual host PythonPath "['/var/www/www.example.com/python'] + sys.path" # All files in this directory use the Publisher handler <Directory /var/www/www.example.com/site/app> SetHandler python-program PythonHandler mod_python.publisher PythonDebug On </Directory> # Custom virtual handler, using module in Python path <Location /virtual> SetHandler python-program # this module (can be a package) must be in the Python path! PythonHandler virtual PythonDebug On </Location> With this approach, various handlers in a specific host can share a common directory of modules, without needing to add it to the system's site-packages directory, where it would be too public. There is also a security advantage in storing database connection credentials outside the DocumentRoot, where they are less likely to be exposed (due to a misconfiguration, or absent-mindedly moving your code to a new host before mod_python is properly configured). You simply import the modules as you would in any other Python application. I'm happy with this approach, but the biggest disadvantage is that it won't take full advantage of automatic module reloading, so moving new code to a production environment might still involve restarting apache httpd. For alternative approaches and an excellent explanation of how packages are affected by the new module importer, see Graham's response in this thread: http://www.modpython.org/pipermail/mod_python/2006-November/022726.html
|