IR labs
labs at ixopusada.com
Thu Sep 1 20:54:43 EDT 2005
Hi, I am not sure whether I should start a new thread, but my issues are not yet solved and the subject line is still partly accurate, so I'll just continue. To get my ideas working, I tried both the options that I saw in my last post, but I am getting stuck in both. Let me start with the one, with which I progressed the most: 1. Don't use transhandler. Have a main.py as the PythonHandler for the www/root directory. <Directory /var/www/root> SetHandler mod_python PythonHandler main </Directory> ---- with main.py: ---- def handler(req): extension = os.path.splitext(req.filename)[1] if extension == ".html" or extension == "": if not os.path.exists(req.filename): ... (handle further) return apache.OK else: if extension == '': req.filename = req.filename + "/index.html" # THIS LINE SEEMS NOT TO HAVE AN EFFECT return apache.DECLINED else: return apache.DECLINED When a url is requested for an existent .html file, it works fine: apache serves the .html file itself. However if the url is only the name of a directory, I can't seem to give apache its normal –complete– behavior. (E.g. the url www.foobar.com/foo/ (assuming the directory foo/ exists) does not return a directory listing of the contents of that directory nor does it display www.foobar.com/foo/index.html if there is such a file.) And it seems I also can't change the filename anymore in that handler phase. The only solution I found was to put an .htaccess file in /foo/ saying "SetHandler none". But I was actually looking for a way in which I would not need these .htaccess files when there is just an index.html present. Is there any way I still can set the filename in this phase? Then I thought that maybe transhandler could help me in the end, but I got stuck with that one rather soon. 2. Using transhandler to set the filename and have it decide what apache should be doing. <IfModule mod_python.c> PythonPath "sys.path + ['/var/www/python/']" PythonTransHandler translate </IfModule> ---- and from translate.py: ---- def transhandler(req): ... req.filename = '/var/www/python/main.py' return apache.OK The issue I run against is that now apache shows the code from main.py. It doesn't execute it, it just shows the code. Despite all the other directives I use (in httpd.conf or .htaccess). Even when I add the line 'req.add_handler("PythonHandler", "main")' to the mix, it won't execute main.py, just displays its code. Any ideas how to I solve this? Many thanks, dirk On 31-aug-05, at 00:49, Graham Dumpleton wrote: > > On 31/08/2005, at 5:44 AM, IR labs wrote: >> >> But thanks for this solution to have everything (also the stuff we >> don't want to handle) handled by the handler in main.py. >> My only remaining question now, would be what you recommend? >> 1. Don't use the transhandle phase, and have *all* requests handled >> by the main PythonHandler, including the ones it shouldn't handle ( >> apache.DECLINE) >> or. >> 2. Use the TransHandler phase to discern between real physical >> present files (requests for .html, .css, .js etc. files) and virtual >> pages that should be handled by main.py > > It all depends on exactly what you want to do, as these probably aren't > the only alternatives. If you want a request against a directory to be > rerouted, look at the DirectoryIndex directive. If you want to reroute > a > request against a non existent file based on a specific extension type, > you may also be able to use mod_rewrite. Finally, there is also the > ErrorDocument directive for non existent files as well. All of these > might feasibly be harnessed to provide part of the solution and using > Python to make the decision may be a more complicated choice than some > of Apache's core features designed for this sort of thing. > > Graham > > > ----------------------------- Dirk van Oosterbosch dirk at ixopusada.com -----------------------------
|