Kamil Niechajewicz
kamil at nvstudio.pl
Wed Apr 14 15:29:58 EST 2004
Okay, I quite see the problem with importing wrong modules, where there are two or more dirs with modules named the same (like just simple index.py which is default module for Publisher) The problem is there is no namespace for different 'modules' - here I mean directories. I will provide a sample app for easier explanation: /app_root index.py - http://localhost/ = main page admin/ index.py - http://localhost/admin = admin panel tree.py - http://localhost/admin/tree = show tree of objects We put a single Apache directive: <Directory /app_root> SetHandler mod_python.publisher ... other statements here, I will ommit them because everyone probably knows what goes into such declaration </Directory> Now the test: 1. We enter site at url http://localhost/ -> page shows correctly content generated by /app_root/index.py. The module index.py is loaded. 2. We enter site at url http://localhost/admin -> page shows correctly content generated by /app_root/admin/index.py 3. We enter site at url http://localhost/ again -> page shows content of /app_root/admin/index.py, because reimporting module 'index' does not occur - module_import checks that module is loaded, checks its mtime and decides not to reimport it, so we end with 'index' module from a wrong 'package'. 4. We can reload this page a few times - it still shows wrong content, because module is not reloaded, but after some time it reloads it and again shows what should be shown. There is an ad hoc solution - just force import_module() to reimport modules every time, but it is not very efficient ;) The best solution would be changing Publisher (or maybe even apache.py) to somehow recognize 'packages' - in the above sample our packages could be named 'default' (for /app_root/*) and 'admin' (for /app_root/admin). This would lead to modules named default.index and admin.index, so there will be no place for mistake because we will have usunual namespace for every directory. Actually it works strange, because it only recognizes 'modules' from the path in url, like 'some/package/index' is module 'index' for it, and 'some/other/package/index' is also 'index'. sys.path has something to do here, but anyway, it should be like some.package.index and some.other.package.index when importing them by Publisher, because only that will help to recognize proper modules with the same name in the module list. Am I right? /Kamil
|