Graham Dumpleton
grahamd at dscpl.com.au
Fri Feb 4 22:51:32 EST 2005
On 05/02/2005, at 1:27 AM, Shawn Harrison wrote: >> I could mention Vampire yet again and how it has solved this problem >> and many other module loading issues, but based on the continuing >> followups which show that no one has read what I said, I will refrain >> from doing so ..... ;-( > > I do have a question about Vampire. I want to have a Python script > > /web/websitename/www/photos/index.py > > where I've appended /web to sys.path, so that > > websitename.www.photos.index > > is a module name. Okay. I want to publish photos with urls like > > http://websitename/photos/2004/10/01/137 > > Can Vampire send all requests for paths under /photos/ to the photos Not knowing for sure what you are wanting to do, I am going to assume that you want to wrap image files in a HTML page automatically. Firstly, Vampire is structured so as to avoid altogether use of sys.path and all the complications that can arise because of it. Thus, you would not add "/web" to sys.path. Thus, to configure things, one would use: Options -Indexes -MultiViews SetHandler python-program PythonHandler vampire PythonPath 'sys.path' PythonDebug On Indexes are turned off because we wouldn't want it, and MultiViews is turned off because auto negotiation of file types screws with how Vampire works. PythonPath is set to "sys.path" in order to stop mod_python from adding that directory into "sys.path" as we don't want that either. This is so nothing tries to attempt to load any Python code files in the document tree as Python modules using "import". Assuming that the "photos" directory is where the images actually live, am going to change things around a little and rename "photos" to "library". Rather than create a Python code file residing at "photos/index.py" it would be called "photos.py". In this is placed the code at the end of this email. I can now say: http://websitename/photos/2004/10/01/137 What will happen with how I have written this is that it will display a HTML page including a header which is the path to the image. It will include also include an <img> tag so that the image will be loaded into the HTML page as well. In terms of what you are probably wanting, the important thing is the "req.path_info" data. This is the part of the path which matches beyond the actual content handler found to service the request. This was used to look in the "library" directory to see if there was a corresponding image with a supported extension type. If none was found, a not found error would be returned. If one was, the HTML page would be displayed. One could if one wants, really fancy up the HTML page and also detect when reference was made to a directory and generate a HTML index page instead. With the help of other content handler scripts, one could even generate thumbnails on the fly in the index pages where appropriate. Anyway, not sure how close this might be to what you want to finally achieve, but at least shows use of "req.path_info". Note that the reason I had to rename the directory containing the images is that the way Apache resolves paths, it will give precedence to subdirectory search matching and thus will not hand off control to Vampire properly if I had "photos.py" handler and "photos" directory. I could have instead put the code in the "photos" subdirectory, but wouldn't have called it "index.py" but "browse.py". This is nothing to do with the problems that mod_python.publisher has with having lots of files called "index.py", as Vampire can quite happily cope with that. It is because the URL would then needed to have instead be: http://websitename/photos/browse/2004/10/01/137 It looks better to have "browse" rather than "index". Note though that if I had called it "browse.py" and put it in the directory itself, the code would need a slight tweak and where "subdir" is set to "library", make it "." instead. Ie., start searching from the current directory and not a "library" subdirectory. Hope this is of interest. This might actually be a good example for me of showing off Vampire. Although, I could see it being extended further than this simple bit of code to become a nice photo album viewer. Graham # Now for the code. from mod_python import apache import os import posixpath _PAGE = """ <html> <body> <h1>Photo: %(name)s</h1> <img src="%(url)s" /> </body> </html> """ # Handler for virtual directory. def handler(req): # Determine stub of image file to view. if req.path_info == "": return apache.HTTP_BAD_REQUEST elif req.path_info == "/": return apache.HTTP_BAD_REQUEST name = os.path.splitext(req.path_info[1:])[0] # Determine what type of image file it is. subdir = "library" # subdir = "." # use this if wanting to make it "browse.py" in "photos" subdir root = os.path.join(os.path.dirname(req.filename),subdir) path = None extn = None allowed = [ ".jpg", ".gif" ] for suffix in allowed: file = os.path.join(root,name) + suffix if os.path.exists(file): path = file extn = suffix if path == None: return apache.HTTP_NOT_FOUND # Determine the URL to the actual image. baseurl = os.path.dirname(req.uri[:-len(req.path_info)]) url = posixpath.join(baseurl,subdir,name+extn) content = _PAGE % { "name": name, "url": url } # Return the rendered page content. req.content_type = "text/html" req.send_http_header() req.write(content) return apache.OK
|