Code

Ticket #2407: cgi.py

File cgi.py, 2.2 KB (added by Marc Fargas <telenieko@…>, 7 years ago)

to be placed in django/core/servers

Line 
1"""
2CGI wrapper for Django using the WSGI protocol
3
4Code copy/pasted from PEP-0333 and then tweaked to serve django.
5http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side
6"""
7
8import os, sys 
9import django.core.handlers.wsgi
10
11def runcgi():
12    environ                      = dict(os.environ.items())
13    environ['wsgi.input']        = sys.stdin
14    environ['wsgi.errors']       = sys.stderr
15    environ['wsgi.version']      = (1,0)
16    environ['wsgi.multithread']  = False
17    environ['wsgi.multiprocess'] = True
18    environ['wsgi.run_once']     = True
19
20    application = django.core.handlers.wsgi.WSGIHandler()
21   
22    if environ.get('HTTPS','off') in ('on','1'):
23        environ['wsgi.url_scheme'] = 'https'
24    else:
25        environ['wsgi.url_scheme'] = 'http'
26   
27    headers_set  = []
28    headers_sent = []
29   
30    def write(data):
31        if not headers_set:
32             raise AssertionError("write() before start_response()")
33       
34        elif not headers_sent:
35             # Before the first output, send the stored headers
36             status, response_headers = headers_sent[:] = headers_set
37             sys.stdout.write('Status: %s\r\n' % status)
38             for header in response_headers:
39                 sys.stdout.write('%s: %s\r\n' % header)
40             sys.stdout.write('\r\n')
41       
42        sys.stdout.write(data)
43        sys.stdout.flush()
44   
45    def start_response(status,response_headers,exc_info=None):
46        if exc_info:
47            try:
48                if headers_sent:
49                    # Re-raise original exception if headers sent
50                    raise exc_info[0], exc_info[1], exc_info[2]
51            finally:
52                exc_info = None     # avoid dangling circular ref
53        elif headers_set:
54            raise AssertionError("Headers already set!")
55       
56        headers_set[:] = [status,response_headers]
57        return write
58   
59    result = application(environ, start_response)
60    try:
61        for data in result:
62            if data:    # don't send headers until body appears
63                write(data)
64        if not headers_sent:
65            write('')   # send headers now if body was empty
66    finally:
67        if hasattr(result,'close'):
68            result.close()