Graham Dumpleton
graham.dumpleton at gmail.com
Fri Aug 31 18:20:19 EDT 2007
On 01/09/2007, hhanke at pdx.edu <hhanke at pdx.edu> wrote: > Quoting Graham Dumpleton <graham.dumpleton at gmail.com>: > > On 31/08/2007, hhanke at pdx.edu <hhanke at pdx.edu> wrote: > >> please, I'm using apache.import_module() to import my modules > >> in mod_python 3.2.8 (I'm stuck with this version on our > >> production server). Since it has its problems, please, what > >> is the easiest way to reload all modules? > > The only reliable way is to restart the whole of Apache. > > This just cannot be done on a production sever where multiple > websites run and a server I as a developer have no controll about. > > > If it were a development server, you could also use the brute force > > method of having the Apache child process restart after every request. > > This is done using the Apache directive: > > MaxRequestsPerChild 1 > > This should however never be used on a production server, as it would > > give CGI like performance. > > It would be acceptable to use it for a short period, e.g. after updating > the website to the new release version, but since I can't do that on > a per-directory basis through .htaccess, it is of no use on a production > server where multiple websites run and I can't edit the global conf. > > > In short, there is no good way of doing it. > > So how do I use Python for writing more complicated webpages, > that need to use modules (both my own and completely external > that I have no controll about and they use the classical import)? > Do I have to use CGI then? > > > Even the module importer in 3.3.1 is only of use to web application > > code which is managed by mod_python and not normal Python modules > > on sys.path. > > Hm... Can I somehow force the reload of a given module that I imported > through apache.import_module manually? I mean an equivalent of reload(). Have you read the documentation for 'import_module()' in mod_python 3.3.1? http://www.modpython.org/live/current/doc-html/pyapi-apmeth.html The whole point of 'import_module()' is that provided the modules are ones which mod_python can manage (not on sys.path), then when you make changes to a module, or a module which is depended upon by another module, the top level module and any modules on the path down to the changed module will be automatically reloaded. But then, if you cant upgrade to 3.3.1 you will be stuck with the older implementation of 'import_module()' which has lots of problems and doesn't handle reloading when child modules are changed. See: http://www.dscpl.com.au/wiki/ModPython/Articles/ModuleImportingIsBroken If CGI is an option, because you aren't really using mod_python specific features anyway, then yes you could use CGI, but in that case you would better off converting your application to be a WSGI application and using mod_wsgi (www.modwsgi.org) with its daemon mode. In daemon mode of mod_wsgi your application is delegated to its own separate process and you can control restarts of just that process using signals. This allows one to implement an automatic reloader. See: http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode In summary, with mod_python your production box is best used only for deployment and not for development. You can only get so far using 'import_module()' properly on a production box, sometimes you just cant avoid doing a restart. Thus you really need to use a separate Apache instance when you are doing development with mod_python if you have no ability to restart your production server. Graham
|