[mod_python] mod_python + vampire + psp

Graham Dumpleton grahamd at dscpl.com.au
Mon Jan 17 03:30:45 EST 2005


On 17/01/2005, at 5:50 PM, Graham Dumpleton wrote:

> Keerati Inochanon wrote ..
>> Hi,
>>
>> I am a couple-of-day old python programmer. I decided to give a shot
>> at mod_python. I successfully installed mod_python, but I am still
>> trying to work with vampire. I would like psp files to be able to call
>> functions in other modules (ie. a .py file). Before installing
>> vampire, I was able to do this by calling filename/function (eg. <form
>> action="authentication/login" method="post" name="doe"> ) . If I do
>> the same thing now, it will give me a 404 file not found error.
>> Putting http://domain/filename/function in the location bar will not
>> work either.
>>
>> ...
>>
>> I am using the .vampire and default-handlers.py as provided with the
>> source as the default content handler. Vampire is now mapping html
>> extension to psp. The psp file snippet is below:
>>
>> <html>
>> <form action="authentication/login" method="post" name="auth">
>>   Username: <input type="text" name="username"></input><br>
>>   Password: <input type="password" name="password"></input><br>
>>   <input type="hidden" name="isFirst" value="False"></input>
>>   <input type="submit" value="Login">
>> </form>
>> </html>
>>
>> Any help will be much appreciated. Thank you very much!
>
> The form is merely a POST against a URL, specifically 
> "authentication/login".
> Using Vampire, you should therefore have a file:
>
>   authentication/login.py
>
> In this file it would have a handler defined as:
>
>   def handler(req,username,password,isFirst):
>     ...
>
> The method is just "handler()" in this case, as the URL being posted 
> against
> has no extension on it.
>
> At least that is how it should work. I'll test it when I get home and 
> post again
> then.

Have twigged now on what you are doing differently.

When using PSP directly, your login handler was being implemented in
the style expected by mod_python.publisher. That is, for 
"authentication/login"
you would have had a file called "authentication.py" with a function in
it called "login".

In Vampire, it does not use the mod_python.publisher style of mapping 
URLs to
actual files. In mod_python.publisher generally all but the last part 
of the
URL identifies the path to the file and the last part identifies the 
method
within the file.

In Vampire, the whole URL (or as much as possible) is used to identify 
the
path to the file. Any extra is supplied in the "req" object as 
"path_info".
The method executed in the file will be handler(), or if the last 
component
on the URL used to identify the file has an extension, the 
handler_extn(),
method where "extn" is replaced with the actual extension.

What this means is that when using mod_python.publisher, there can be
multiple methods in the same code file which are associated with 
different
resource URLs. If an extension is used and AddHandler is set 
appropriately,
the extension has no real meaning.

In Vampire, each code file only has methods related to one specific 
resource.
There may however be different methods for delivering up the resource in
different formats. Which is called is dictated by the extension used in 
the
URL.

Thus in Vampire, mapping to functions is different. The other thing to 
know
is that the handler functions in Vampire follow the standard mod_python
form. That is, its return value is a status value. In 
mod_python.publisher
the return value will be the actual content, which if not HTML, will be
converted to HTML. If a specific status has to be returned an exception 
is
instead raised.

Note though that Vampire supports the mod_python.publisher like 
extension
of being able to accept form parameters as method parameters of the
handler method. In doing this though, it is mandatory that the first
argument of the handler method still be the "req" object whereas in
mod_python.publisher accepting the req object is optional and could be
placed in any position.

That said, if the only method in authentication.py to be called via a
URL is login(), you could instead renamed authentication.py to login.py
and change the method from login() to handler() and the the action in
form would just be "login". You obviously still need change the 
handler()
method to be implemented more in the form of a standard handler and not
a mod_python.publisher method.

Hope this helps.

--
Graham Dumpleton (grahamd at dscpl.com.au)



More information about the Mod_python mailing list