So I am running off of the example at:
http://pythonpaste.org/do-it-yourself-framework.html
I have a lighttpd server setup with mod_scgi.
I am using Debian Unstable and it's python-paste package version 1.3-2
Also using the python-flup package version 0.2307-1
Now the simple examples work fine. The 'hello world' and the
'interactive app' examples work fine for both using localhost httpserver
from paste and flup.server.scgi.WSGIServer from flup.
But when I try the more complex example it mysteriously fails and I
can't figure out why.
I realy have no clue what I am doing. All this python web stuff is very
confusing and mystifying. It took me a few days of mucking around before
I found paste and I am just trying to get it working so that I can start
to play around with it.. but I can't even seem to do that.
Is there a similar wsgi-->scgi thing from paste itself? I saw the 'SWAP'
stuff and I tried using scgiserver, but I can't ever get it to work for
me. I am sure that I am mucking that up also.
So this is what I am working with:
whatever.py:
from objectpub import ObjectPublisher
class Root(object):
# The "index" method:
def __call__(self):
return '''
<form action="welcome">
Name: <input type="text" name="name">
<input type="submit">
</form>
'''
def welcome(self, name):
return 'Hello %s!' % name
app = ObjectPublisher(Root())
if __name__ == '__main__':
from flup.server.scgi import WSGIServer
WSGIServer(app,bindAddress=('192.168.0.50', 4000)).run()
#from paste import httpserver
#httpserver.serve(app, host='127.0.0.1', port='8080')
And then objectpub.py
from paste.request import parse_formvars
class ObjectPublisher(object):
def __init__(self, root):
self.root = root
def __call__(self, environ, start_response):
fields = parse_formvars(environ)
print fields, "feilds"
print type(fields), "feilds type"
obj = self.find_object(self.root, environ)
print obj, "obj"
response_body = obj(**fields.mixed())
print response_body
start_response('200 OK', [('content-type', 'text/html')])
return [response_body]
def find_object(self, obj, environ):
path_info = environ.get('PATH_INFO', '')
if not path_info or path_info == '/':
# We've arrived!
return obj
# PATH_INFO always starts with a /, so we'll get rid of it:
path_info = path_info.lstrip('/')
# Then split the path into the "next" chunk, and everything
# after it ("rest"):
parts = path_info.split('/', 1)
next = parts[0]
if len(parts) == 1:
rest = ''
else:
rest = '/' + parts[1]
# Hide private methods/attributes:
assert not next.startswith('_')
# Now we get the attribute; getattr(a, 'b') is equivalent
# to a.b...
next_obj = getattr(obj, next)
# Now fix up SCRIPT_NAME and PATH_INFO...
environ['SCRIPT_NAME'] += '/' + next
environ['PATH_INFO'] = rest
# and now parse the remaining part of the URL...
return self.find_object(next_obj, environ)
So you see I added some 'print' statements to the __call__
When I run it I can get to the first part were you type in a name and
can press enter.
This is the output on the command line:
$ python whatever.py
2007-05-03 21:17:14 : WSGIServer starting up
2007-05-03 21:17:26 : GET /scripts/
MultiDict([]) feilds
<type 'instance'> feilds type
<__main__.Root object at 0xb79c684c> obj
<form action="welcome">
Name: <input type="text" name="name">
<input type="submit">
</form>
2007-05-03 21:17:32 : GET /scripts/welcome
MultiDict([('name', 'asdf')]) feilds
<type 'instance'> feilds type
<__main__.Root object at 0xb79c684c> obj
2007-05-03 21:17:32 : Exception caught from handler
Traceback (most recent call last):
File "/var/lib/python-support/python2.4/flup/server/scgi_base.py",
line 185, in run
self._conn.server.handler(self)
File "/var/lib/python-support/python2.4/flup/server/scgi_base.py",
line 456, in handler
result = self.application(environ, start_response)
File "/home/drag/mnt/objectpub.py", line 15, in __call__
response_body = obj(**fields.mixed())
TypeError: __call__() got an unexpected keyword argument 'name'
this is what it looks like when it runs correctly from the httpserver
serving on http://127.0.0.1:8080
MultiDict([]) feilds
<type 'instance'> feilds type
<__main__.Root object at 0xb79aa84c> obj
<form action="welcome">
Name: <input type="text" name="name">
<input type="submit">
</form>
MultiDict([('name', 'asdf')]) feilds
<type 'instance'> feilds type
<bound method Root.welcome of <__main__.Root object at 0xb79aa84c>> obj
Hello asdf!
The only difference I see is the 'bound method' line. But I have no clue
what that is or what or why it's different.
Is there a different way to get this stuff working with SCGI or FastCGI?
_______________________________________________
Paste-users mailing list
[email protected]
http://webwareforpython.org/cgi-bin/mailman/listinfo/paste-users