【转】ZSI + mod_wsgi

ZSI in mod_wsgi

Hello,

I've been using the dispatch.AsCGI handler from ZSI behind an apache for
quite a while. Now that the load is increasing on the server, the cost
of forking CGIs becomes a bottleneck. After making my handling process
thread safe, I've integrated it in mod_wsgi environment.

While looking for this list, I stumbled upon
http://sourceforge.net/mailarchive/message.php?msg_id=9982866
I haven't looked at the ZSI.ServiceContainer, but for the ZSI.dispatch,
based on AsCGI, I've added the following, which works for me:

--8<--
def _WSGISendXML(text, code = "200 OK", **kw):
    response_headers = [('Content-type', 'text/xml; charset="%s"'
%UNICODE_ENCODING), ('Content-Length', str(len(text)))]
    kw['start_response'](code, response_headers)
    return [text]

def _WSCGISendFault(f, **kw):
    return _WSGISendXML(f.AsSOAP(), "500 Internal Server Error", **kw)

def AsWSGI(environ, start_response, nsdict={}, typesmodule=None, rpc=False,
modules=None):
    '''Dispatch within mod_wsgi
    '''
    if environ.get('REQUEST_METHOD') != 'POST':
        return _WSCGISendFault(Fault(Fault.Client, 'Must use POST'),
start_response = start_response)
    ct = environ['CONTENT_TYPE']
    try:
        if ct.startswith('multipart/'):
            cid = resolvers.MIMEResolver(ct, environ['wsgi.input'])
            xml = cid.GetSOAPPart()
            ps = ParsedSoap(xml, resolver=cid.Resolve)
        else:
            length = int(environ['CONTENT_LENGTH'])
            ps = ParsedSoap(environ['wsgi.input'].read(length))
    except ParseException, e:
        return _WSCGISendFault(FaultFromZSIException(e), start_response =
start_response)
    except ExpatError, e:
        return _WSCGISendFault(FaultFromZSIException(e), start_response =
start_response)
    return dispatch._Dispatch(ps, modules, _WSGISendXML, _WSCGISendFault,
nsdict=nsdict,
              typesmodule=typesmodule, rpc=rpc, start_response = start_response)
--
Note: in AsWSGI, the ExpatError exception is raised when an incorrectly
formatted XML flow is received. But shouldn't it be trapped in
ParsedSoad and raised as a ParseException?

Then, my .wsgi script looks like:
--8<--
from ZSI import dispatch
import sessionManagement

def application(environ, start_response):
    return dispatch.AsWSGI(environ, start_response, modules =
(sessionManagement,))
--

Best Regards,
 
 
原始链接:
http://permalink.gmane.org/gmane.comp.python.pywebsvcs.general/3594

你可能感兴趣的:(python,webservice,SOAP)