# Modpython wsgi + Nevow
# You should modify 'prefix' variable
# The URL of this cgi script
prefix = 'http://localhost/test-modpy.py'
import os,sys
from mod_python import apache
def run_with_modpy(req, application):
environ = dict(os.environ.items())
environ['wsgi.input'] = req
environ['wsgi.errors'] = sys.stderr
environ['wsgi.version'] = (1,0)
environ['wsgi.multithread'] = False
environ['wsgi.multiprocess'] = True
environ['wsgi.run_once'] = True
if environ.get('HTTPS','off') in ('on','1'):
environ['wsgi.url_scheme'] = 'https'
else:
environ['wsgi.url_scheme'] = 'http'
# mod_python has environment variables in 'req' object
environ['PATH_INFO'] = req.path_info
headers_set = []
headers_sent = []
def write(data):
if not headers_set:
raise AssertionError("write() before start_response()")
elif not headers_sent:
# Before the first output, send the stored headers
status, response_headers = headers_sent[:] = headers_set
req.headers_out['Status'] = status
# log('status - %s' % status)
from StringIO import StringIO
for header in response_headers:
key, value = header
value = StringIO(value).read() # convert _apache string to python string
if key == 'location':
# Perform an internal (apache) redirect
req.internal_redirect(value)
# req.write('<li><b>'+str(key)+'</b>: '+str(value)+'</li>')
if type(str(value)) is not type(str()):
raise 'oops'+ str(value)+str(type(str(value)))
req.headers_out[str(key)] = str(value)
req.write(data)
req.flush()
def start_response(status,response_headers,exc_info=None):
global headers_sent
if exc_info:
try:
if headers_sent:
# Re-raise original exception if headers sent
raise exc_info[0], exc_info[1], exc_info[2]
finally:
exc_info = None # avoid dangling circular ref
elif headers_set:
raise AssertionError("Headers already set!")
headers_set[:] = [status,response_headers]
return write
result = application(environ, start_response)
try:
for data in result:
if data: # don't send headers until body appears
write(data)
if not headers_sent:
write('') # send headers now if body was empty
finally:
if hasattr(result,'close'):
result.close()
#TODO
return apache.OK
################################## Nevow #################
from nevow import rend,loaders,url
from nevow import tags
# debug
request = None
def log(st):
pass
#request.write('<br/><b>DEBUG</b>: %s' % st)
class Index(rend.Page):
addSlash = True
def __init__(self, name='main'):
log('Creating instance - %s' % name)
rend.Page.__init__(self)
self.name = name
def render_name(self, ctx, data):
return self.name
def render_links(self, ctx, data):
inner = [T.li[T.a(href=url.here.child(x))[x]] for x in ['a', 'b', 'c']]
return T.ul[inner]
def childFactory(self, ctx, name):
log('Looking child %s' % name)
return Index(self.name+'/'+name)
docFactory = loaders.stan(
T.html[
T.head[T.title['Nevow wsgi Test modpy app']],
T.body[
T.h1(render=T.directive('name')),
T.invisible(render=T.directive('links'))
]
]
)
#########################################################
#########################################################
def handler(req):
global request
request = req
req.content_type = "text/html"
from nevow import wsgi
wsgiApp = wsgi.createWSGIApplication(Index(), prefix)
return run_with_modpy(req, wsgiApp)
|