|
Graham Dumpleton
grahamd at dscpl.com.au
Tue Feb 6 15:11:07 EST 2007
Very quickly as plane goes in about an hour..... :-)
See comments below.
Dirk van Oosterbosch, IR labs wrote ..
> Hi,
>
> I am not sure if this the right list to ask, since 3.3 is still in
> beta, but after reading the documentation about PythonPath and
> import_module I'm running into problems as I try to follow the
> directions expressed in the documentation.
>
> First off, let me state that when I upgraded to mod_python 3.3, I was
> happily surprised that everything just worked like before, with only
> changes visible in the log file. However, as I tried to fix something
> (PythonPath and importing modules) which didn't seem to cause
> problems, things broke down and I can't get them to work according to
> the docs.
> "Why trying to fix it then, when there was no problem?", you ask.
> Good question ;-)
>
> My initial setup was like this:
> in httpd.conf:
> ====================
> <IfModule mod_python.c>
> PythonPath "sys.path + ['/Users/me/Sites/www/python/']"
> PythonTransHandler translate
> ...
>
> in the .htaccess file in .../www/python/:
> ====================
> AddHandler mod_python .py
> PythonHandler main
>
> Then in main.py (the main handler which is called for every request):
> ====================
> # for loading a Cheetah template
> templatesFolderLocation = "/Users/me/Sites/www/python/templates"
> if templatesFolderLocation not in sys.path:
> sys.path.append(templatesFolderLocation)
> ...
> modulename = 'page'
> ...
> try:
> module = __import__(modulename, globals(), locals(), [modulename])
> except ImportError:
> ...
> templateClass = getattr(module, name)
>
>
> As said, this code works. Though it is not very nice and clean, and I
> understood I had to go this way, while I was waiting for mod_python
> 3.3. Now I got python 3.3 and I read the documentation about
> apache.import_module() and about PythonPath, and I want to change the
> code so it will make proper use of the new importer.
>
> The first thing I noticed in the docs is that the PythonPath
> shouldn't contain paths which are in the document tree.
This is only really an issue if the modules in the directory in the
document tree are being imported directly by mod_python importer
by reference in Python*Handler, by mod_python.publisher or by
direct use by apache.import_module(). If the modules in said
directory aren't being included in this way, it is okay to list
a subdirectory somewhere in the document tree in PythonPath.
The important thing is that you want to avoid having modules imported
through both mechanisms.
One step to ensure that anything in a directory isn't used by mod_python
in some way inadvertantly by mod_python.publisher, is to add into the
directory a .htaccess file containing:
deny from all
If using own handler, not so big a deal.
I have managed to get Cheetah to use mod_python importer from within its
generated code before. The trick is to use import_module() instead of
__import__ to import the Cheetah template top level code file.
Ie., don't use:
module = __import__(modulename, globals(), locals(), [modulename])
use:
module = apache.import_module('/actual/path.py')
Then have the templates directory in:
PythonOption mod_python.importer.path ['/actual/path/to/templates']
Try playing with that. If after my nine hour flight to next airport
I find some free internet access, I'll have a look to see how you went.
Anyway, hope I didn't muddle that because of being in a hurry.
:-) :-) :-) :-)
Graham
> http://www.modpython.org/live/mod_python-3.3.0b/doc-html/app-changes-
> from-3.2.10.html :
> > The PythonPath directive MUST not be used to point at directories
> > within the document tree.
>
> So I changed the PythonPath line in httpd.conf into
> PythonOption mod_python.importer.path "['/Users/dirk/Sites/www/
> python']"
>
> But –as somewhat expected– this breaks the Cheetah module importing
> code.
> I tried to change it according to the docs
> (these http://www.modpython.org/live/mod_python-3.3.0b/doc-html/pyapi-
> apmeth.html )
>
> So now the code in main.py looks like this:
> ====================
> # for loading a Cheetah template
> templatesFolderLocation = "/Users/me/Sites/www/python/templates"
> # not appending to sys.path anymore
> ...
> modulename = 'page'
> ...
> try:
> module = apache.import_module(modulename, path=
> [templatesFolderLocation])
> except ImportError:
> ... # importing the module fails here!
> templateClass = getattr(module, name)
>
>
> The reason for the failing import seems to be the inheritance system
> of the templates. Inside the chain of Cheetah modules that are
> inheriting eachother, there is a pure python module (framework.py),
> residing in /www/python (not in /www/python/templates/ !) which tries
> to import a module from /www/python/templates/ through this line:
> from baseTemplate import baseTemplate
> I believe this fails and is the origin of my new problem.
>
> I thought the module search path, which I supplied with the path=
> argument in import_module() was copied forward to all subsequent
> imports, but it seems this does not work for me.
>
> Now I would be happy to add the templates directory to the python
> path again, but as I understood this is not the proper new mod_python
> way.
> However I am reluctant to change the importing mechanism in
> framework.py and make framework dependant on mod_python's apache,
> since I also want to be able to test the cheetah part of my system
> outside of apache.
>
> I hope I am missing something obvious. What would be the most clean
> and proper way to solve this issue?
>
> Thanks!
> dirk
>
>
>
>
>
> -----------------------------
> Dirk van Oosterbosch
> de Wittenstraat 225
> 1052 AT Amsterdam
> the Netherlands
>
> http://labs.ixopusada.com
> -----------------------------
|