Viewing file: test-modpy.py (4.02 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# 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 as T
# 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)
|