Module wsgiserver
source code
A high-speed, production ready, thread pooled, generic WSGI server.
Simplest example on how to use this module directly
(without using CherryPy's application machinery):
from cherrypy import wsgiserver
def my_crazy_app(environ, start_response):
status = '200 OK'
response_headers = [('Content-type','text/plain')]
start_response(status, response_headers)
return ['Hello world!
']
server = wsgiserver.CherryPyWSGIServer(
('0.0.0.0', 8070), my_crazy_app,
server_name='www.cherrypy.example')
The CherryPy WSGI server can serve as many WSGI applications
as you want in one instance by using a WSGIPathInfoDispatcher:
d = WSGIPathInfoDispatcher({'/': my_crazy_app, '/blog': my_blog_app})
server = wsgiserver.CherryPyWSGIServer(('0.0.0.0', 80), d)
Want SSL support? Just set server.ssl_adapter to an SSLAdapter instance.
This won't call the CherryPy engine (application side) at all, only the
WSGI server, which is independent from the rest of CherryPy. Don't
let the name "CherryPyWSGIServer" throw you; the name merely reflects
its origin, not its coupling.
For those of you wanting to understand internals of this module, here's the
basic call flow. The server's listening thread runs a very tight loop,
sticking incoming connections onto a Queue:
server = CherryPyWSGIServer(...)
server.start()
while True:
tick()
# This blocks until a request comes in:
child = socket.accept()
conn = HTTPConnection(child, ...)
server.requests.put(conn)
Worker threads are kept in a pool and poll the Queue, popping off and then
handling each connection in turn. Each connection can consist of an arbitrary
number of requests and their responses, so we run a nested loop:
while True:
conn = server.requests.get()
conn.communicate()
-> while True:
req = HTTPRequest(...)
req.parse_request()
-> # Read the Request-Line, e.g. "GET /page HTTP/1.1"
req.rfile.readline()
req.read_headers()
req.respond()
-> response = wsgi_app(...)
try:
for chunk in response:
if chunk:
req.write(chunk)
finally:
if hasattr(response, "close"):
response.close()
if req.close_connection:
return
Changelog: This verison has been temporarily forked by M.D.P. to include
cherrypy pyOpenSSLAdaptor into one single file.
|
|
|
|
|
prevent_socket_inheritance(sock)
Mark the given socket fd as non-inheritable (POSIX). |
source code
|
|
|
|
|
CRLF = ' \r\n '
|
|
quoted_slash = re.compile(r'(?i) %2F')
|
|
_fileobject_uses_str_type = True
|
|
socket_error_eintr = [ 4]
|
|
socket_errors_to_ignore = [ 32, 64, 38, 65, 9, 52, 53, 54, 60, ...
|
|
socket_errors_nonblocking = [ 35]
|
|
comma_separated_headers = [ ' ACCEPT ' , ' ACCEPT-CHARSET ' , ' ACCEPT ...
|
|
_SHUTDOWNREQUEST = None
|
Return error numbers for all errors in errnames on this platform.
The 'errno' module contains different global constants depending on
the specific platform (OS). This function will return the list of numeric
values for a given list of potential names.
|
Like print_exc() but return a string. Backport for Python 2.3.
|
socket_errors_to_ignore
- Value:
[ 32,
64,
38,
65,
9,
52,
53,
54,
...
|
|
comma_separated_headers
- Value:
[ ' ACCEPT ' ,
' ACCEPT-CHARSET ' ,
' ACCEPT-ENCODING ' ,
' ACCEPT-LANGUAGE ' ,
' ACCEPT-RANGES ' ,
' ALLOW ' ,
' CACHE-CONTROL ' ,
' CONNECTION ' ,
...
|
|