1:mod:`wsgiref` --- WSGI Utilities and Reference Implementation 2============================================================== 3 4.. module:: wsgiref 5 :synopsis: WSGI Utilities and Reference Implementation. 6.. moduleauthor:: Phillip J. Eby <pje@telecommunity.com> 7.. sectionauthor:: Phillip J. Eby <pje@telecommunity.com> 8 9 10.. versionadded:: 2.5 11 12The Web Server Gateway Interface (WSGI) is a standard interface between web 13server software and web applications written in Python. Having a standard 14interface makes it easy to use an application that supports WSGI with a number 15of different web servers. 16 17Only authors of web servers and programming frameworks need to know every detail 18and corner case of the WSGI design. You don't need to understand every detail 19of WSGI just to install a WSGI application or to write a web application using 20an existing framework. 21 22:mod:`wsgiref` is a reference implementation of the WSGI specification that can 23be used to add WSGI support to a web server or framework. It provides utilities 24for manipulating WSGI environment variables and response headers, base classes 25for implementing WSGI servers, a demo HTTP server that serves WSGI applications, 26and a validation tool that checks WSGI servers and applications for conformance 27to the WSGI specification (:pep:`333`). 28 29See https://wsgi.readthedocs.org/ for more information about WSGI, and links to 30tutorials and other resources. 31 32.. XXX If you're just trying to write a web application... 33 34 35:mod:`wsgiref.util` -- WSGI environment utilities 36------------------------------------------------- 37 38.. module:: wsgiref.util 39 :synopsis: WSGI environment utilities. 40 41 42This module provides a variety of utility functions for working with WSGI 43environments. A WSGI environment is a dictionary containing HTTP request 44variables as described in :pep:`333`. All of the functions taking an *environ* 45parameter expect a WSGI-compliant dictionary to be supplied; please see 46:pep:`333` for a detailed specification. 47 48 49.. function:: guess_scheme(environ) 50 51 Return a guess for whether ``wsgi.url_scheme`` should be "http" or "https", by 52 checking for a ``HTTPS`` environment variable in the *environ* dictionary. The 53 return value is a string. 54 55 This function is useful when creating a gateway that wraps CGI or a CGI-like 56 protocol such as FastCGI. Typically, servers providing such protocols will 57 include a ``HTTPS`` variable with a value of "1" "yes", or "on" when a request 58 is received via SSL. So, this function returns "https" if such a value is 59 found, and "http" otherwise. 60 61 62.. function:: request_uri(environ, include_query=1) 63 64 Return the full request URI, optionally including the query string, using the 65 algorithm found in the "URL Reconstruction" section of :pep:`333`. If 66 *include_query* is false, the query string is not included in the resulting URI. 67 68 69.. function:: application_uri(environ) 70 71 Similar to :func:`request_uri`, except that the ``PATH_INFO`` and 72 ``QUERY_STRING`` variables are ignored. The result is the base URI of the 73 application object addressed by the request. 74 75 76.. function:: shift_path_info(environ) 77 78 Shift a single name from ``PATH_INFO`` to ``SCRIPT_NAME`` and return the name. 79 The *environ* dictionary is *modified* in-place; use a copy if you need to keep 80 the original ``PATH_INFO`` or ``SCRIPT_NAME`` intact. 81 82 If there are no remaining path segments in ``PATH_INFO``, ``None`` is returned. 83 84 Typically, this routine is used to process each portion of a request URI path, 85 for example to treat the path as a series of dictionary keys. This routine 86 modifies the passed-in environment to make it suitable for invoking another WSGI 87 application that is located at the target URI. For example, if there is a WSGI 88 application at ``/foo``, and the request URI path is ``/foo/bar/baz``, and the 89 WSGI application at ``/foo`` calls :func:`shift_path_info`, it will receive the 90 string "bar", and the environment will be updated to be suitable for passing to 91 a WSGI application at ``/foo/bar``. That is, ``SCRIPT_NAME`` will change from 92 ``/foo`` to ``/foo/bar``, and ``PATH_INFO`` will change from ``/bar/baz`` to 93 ``/baz``. 94 95 When ``PATH_INFO`` is just a "/", this routine returns an empty string and 96 appends a trailing slash to ``SCRIPT_NAME``, even though empty path segments are 97 normally ignored, and ``SCRIPT_NAME`` doesn't normally end in a slash. This is 98 intentional behavior, to ensure that an application can tell the difference 99 between URIs ending in ``/x`` from ones ending in ``/x/`` when using this 100 routine to do object traversal. 101 102 103.. function:: setup_testing_defaults(environ) 104 105 Update *environ* with trivial defaults for testing purposes. 106 107 This routine adds various parameters required for WSGI, including ``HTTP_HOST``, 108 ``SERVER_NAME``, ``SERVER_PORT``, ``REQUEST_METHOD``, ``SCRIPT_NAME``, 109 ``PATH_INFO``, and all of the :pep:`333`\ -defined ``wsgi.*`` variables. It 110 only supplies default values, and does not replace any existing settings for 111 these variables. 112 113 This routine is intended to make it easier for unit tests of WSGI servers and 114 applications to set up dummy environments. It should NOT be used by actual WSGI 115 servers or applications, since the data is fake! 116 117 Example usage:: 118 119 from wsgiref.util import setup_testing_defaults 120 from wsgiref.simple_server import make_server 121 122 # A relatively simple WSGI application. It's going to print out the 123 # environment dictionary after being updated by setup_testing_defaults 124 def simple_app(environ, start_response): 125 setup_testing_defaults(environ) 126 127 status = '200 OK' 128 headers = [('Content-type', 'text/plain')] 129 130 start_response(status, headers) 131 132 ret = ["%s: %s\n" % (key, value) 133 for key, value in environ.iteritems()] 134 return ret 135 136 httpd = make_server('', 8000, simple_app) 137 print "Serving on port 8000..." 138 httpd.serve_forever() 139 140 141In addition to the environment functions above, the :mod:`wsgiref.util` module 142also provides these miscellaneous utilities: 143 144 145.. function:: is_hop_by_hop(header_name) 146 147 Return true if 'header_name' is an HTTP/1.1 "Hop-by-Hop" header, as defined by 148 :rfc:`2616`. 149 150 151.. class:: FileWrapper(filelike, blksize=8192) 152 153 A wrapper to convert a file-like object to an :term:`iterator`. The resulting objects 154 support both :meth:`__getitem__` and :meth:`__iter__` iteration styles, for 155 compatibility with Python 2.1 and Jython. As the object is iterated over, the 156 optional *blksize* parameter will be repeatedly passed to the *filelike* 157 object's :meth:`read` method to obtain strings to yield. When :meth:`read` 158 returns an empty string, iteration is ended and is not resumable. 159 160 If *filelike* has a :meth:`close` method, the returned object will also have a 161 :meth:`close` method, and it will invoke the *filelike* object's :meth:`close` 162 method when called. 163 164 Example usage:: 165 166 from StringIO import StringIO 167 from wsgiref.util import FileWrapper 168 169 # We're using a StringIO-buffer for as the file-like object 170 filelike = StringIO("This is an example file-like object"*10) 171 wrapper = FileWrapper(filelike, blksize=5) 172 173 for chunk in wrapper: 174 print chunk 175 176 177 178:mod:`wsgiref.headers` -- WSGI response header tools 179---------------------------------------------------- 180 181.. module:: wsgiref.headers 182 :synopsis: WSGI response header tools. 183 184 185This module provides a single class, :class:`Headers`, for convenient 186manipulation of WSGI response headers using a mapping-like interface. 187 188 189.. class:: Headers(headers) 190 191 Create a mapping-like object wrapping *headers*, which must be a list of header 192 name/value tuples as described in :pep:`333`. Any changes made to the new 193 :class:`Headers` object will directly update the *headers* list it was created 194 with. 195 196 :class:`Headers` objects support typical mapping operations including 197 :meth:`__getitem__`, :meth:`get`, :meth:`__setitem__`, :meth:`setdefault`, 198 :meth:`__delitem__`, :meth:`__contains__` and :meth:`has_key`. For each of 199 these methods, the key is the header name (treated case-insensitively), and the 200 value is the first value associated with that header name. Setting a header 201 deletes any existing values for that header, then adds a new value at the end of 202 the wrapped header list. Headers' existing order is generally maintained, with 203 new headers added to the end of the wrapped list. 204 205 Unlike a dictionary, :class:`Headers` objects do not raise an error when you try 206 to get or delete a key that isn't in the wrapped header list. Getting a 207 nonexistent header just returns ``None``, and deleting a nonexistent header does 208 nothing. 209 210 :class:`Headers` objects also support :meth:`keys`, :meth:`values`, and 211 :meth:`items` methods. The lists returned by :meth:`keys` and :meth:`items` can 212 include the same key more than once if there is a multi-valued header. The 213 ``len()`` of a :class:`Headers` object is the same as the length of its 214 :meth:`items`, which is the same as the length of the wrapped header list. In 215 fact, the :meth:`items` method just returns a copy of the wrapped header list. 216 217 Calling ``str()`` on a :class:`Headers` object returns a formatted string 218 suitable for transmission as HTTP response headers. Each header is placed on a 219 line with its value, separated by a colon and a space. Each line is terminated 220 by a carriage return and line feed, and the string is terminated with a blank 221 line. 222 223 In addition to their mapping interface and formatting features, :class:`Headers` 224 objects also have the following methods for querying and adding multi-valued 225 headers, and for adding headers with MIME parameters: 226 227 228 .. method:: Headers.get_all(name) 229 230 Return a list of all the values for the named header. 231 232 The returned list will be sorted in the order they appeared in the original 233 header list or were added to this instance, and may contain duplicates. Any 234 fields deleted and re-inserted are always appended to the header list. If no 235 fields exist with the given name, returns an empty list. 236 237 238 .. method:: Headers.add_header(name, value, **_params) 239 240 Add a (possibly multi-valued) header, with optional MIME parameters specified 241 via keyword arguments. 242 243 *name* is the header field to add. Keyword arguments can be used to set MIME 244 parameters for the header field. Each parameter must be a string or ``None``. 245 Underscores in parameter names are converted to dashes, since dashes are illegal 246 in Python identifiers, but many MIME parameter names include dashes. If the 247 parameter value is a string, it is added to the header value parameters in the 248 form ``name="value"``. If it is ``None``, only the parameter name is added. 249 (This is used for MIME parameters without a value.) Example usage:: 250 251 h.add_header('content-disposition', 'attachment', filename='bud.gif') 252 253 The above will add a header that looks like this:: 254 255 Content-Disposition: attachment; filename="bud.gif" 256 257 258:mod:`wsgiref.simple_server` -- a simple WSGI HTTP server 259--------------------------------------------------------- 260 261.. module:: wsgiref.simple_server 262 :synopsis: A simple WSGI HTTP server. 263 264 265This module implements a simple HTTP server (based on :mod:`BaseHTTPServer`) 266that serves WSGI applications. Each server instance serves a single WSGI 267application on a given host and port. If you want to serve multiple 268applications on a single host and port, you should create a WSGI application 269that parses ``PATH_INFO`` to select which application to invoke for each 270request. (E.g., using the :func:`shift_path_info` function from 271:mod:`wsgiref.util`.) 272 273 274.. function:: make_server(host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler) 275 276 Create a new WSGI server listening on *host* and *port*, accepting connections 277 for *app*. The return value is an instance of the supplied *server_class*, and 278 will process requests using the specified *handler_class*. *app* must be a WSGI 279 application object, as defined by :pep:`333`. 280 281 Example usage:: 282 283 from wsgiref.simple_server import make_server, demo_app 284 285 httpd = make_server('', 8000, demo_app) 286 print "Serving HTTP on port 8000..." 287 288 # Respond to requests until process is killed 289 httpd.serve_forever() 290 291 # Alternative: serve one request, then exit 292 httpd.handle_request() 293 294 295.. function:: demo_app(environ, start_response) 296 297 This function is a small but complete WSGI application that returns a text page 298 containing the message "Hello world!" and a list of the key/value pairs provided 299 in the *environ* parameter. It's useful for verifying that a WSGI server (such 300 as :mod:`wsgiref.simple_server`) is able to run a simple WSGI application 301 correctly. 302 303 304.. class:: WSGIServer(server_address, RequestHandlerClass) 305 306 Create a :class:`WSGIServer` instance. *server_address* should be a 307 ``(host,port)`` tuple, and *RequestHandlerClass* should be the subclass of 308 :class:`BaseHTTPServer.BaseHTTPRequestHandler` that will be used to process 309 requests. 310 311 You do not normally need to call this constructor, as the :func:`make_server` 312 function can handle all the details for you. 313 314 :class:`WSGIServer` is a subclass of :class:`BaseHTTPServer.HTTPServer`, so all 315 of its methods (such as :meth:`serve_forever` and :meth:`handle_request`) are 316 available. :class:`WSGIServer` also provides these WSGI-specific methods: 317 318 319 .. method:: WSGIServer.set_app(application) 320 321 Sets the callable *application* as the WSGI application that will receive 322 requests. 323 324 325 .. method:: WSGIServer.get_app() 326 327 Returns the currently-set application callable. 328 329 Normally, however, you do not need to use these additional methods, as 330 :meth:`set_app` is normally called by :func:`make_server`, and the 331 :meth:`get_app` exists mainly for the benefit of request handler instances. 332 333 334.. class:: WSGIRequestHandler(request, client_address, server) 335 336 Create an HTTP handler for the given *request* (i.e. a socket), *client_address* 337 (a ``(host,port)`` tuple), and *server* (:class:`WSGIServer` instance). 338 339 You do not need to create instances of this class directly; they are 340 automatically created as needed by :class:`WSGIServer` objects. You can, 341 however, subclass this class and supply it as a *handler_class* to the 342 :func:`make_server` function. Some possibly relevant methods for overriding in 343 subclasses: 344 345 346 .. method:: WSGIRequestHandler.get_environ() 347 348 Returns a dictionary containing the WSGI environment for a request. The default 349 implementation copies the contents of the :class:`WSGIServer` object's 350 :attr:`base_environ` dictionary attribute and then adds various headers derived 351 from the HTTP request. Each call to this method should return a new dictionary 352 containing all of the relevant CGI environment variables as specified in 353 :pep:`333`. 354 355 356 .. method:: WSGIRequestHandler.get_stderr() 357 358 Return the object that should be used as the ``wsgi.errors`` stream. The default 359 implementation just returns ``sys.stderr``. 360 361 362 .. method:: WSGIRequestHandler.handle() 363 364 Process the HTTP request. The default implementation creates a handler instance 365 using a :mod:`wsgiref.handlers` class to implement the actual WSGI application 366 interface. 367 368 369:mod:`wsgiref.validate` --- WSGI conformance checker 370---------------------------------------------------- 371 372.. module:: wsgiref.validate 373 :synopsis: WSGI conformance checker. 374 375 376When creating new WSGI application objects, frameworks, servers, or middleware, 377it can be useful to validate the new code's conformance using 378:mod:`wsgiref.validate`. This module provides a function that creates WSGI 379application objects that validate communications between a WSGI server or 380gateway and a WSGI application object, to check both sides for protocol 381conformance. 382 383Note that this utility does not guarantee complete :pep:`333` compliance; an 384absence of errors from this module does not necessarily mean that errors do not 385exist. However, if this module does produce an error, then it is virtually 386certain that either the server or application is not 100% compliant. 387 388This module is based on the :mod:`paste.lint` module from Ian Bicking's "Python 389Paste" library. 390 391 392.. function:: validator(application) 393 394 Wrap *application* and return a new WSGI application object. The returned 395 application will forward all requests to the original *application*, and will 396 check that both the *application* and the server invoking it are conforming to 397 the WSGI specification and to RFC 2616. 398 399 Any detected nonconformance results in an :exc:`AssertionError` being raised; 400 note, however, that how these errors are handled is server-dependent. For 401 example, :mod:`wsgiref.simple_server` and other servers based on 402 :mod:`wsgiref.handlers` (that don't override the error handling methods to do 403 something else) will simply output a message that an error has occurred, and 404 dump the traceback to ``sys.stderr`` or some other error stream. 405 406 This wrapper may also generate output using the :mod:`warnings` module to 407 indicate behaviors that are questionable but which may not actually be 408 prohibited by :pep:`333`. Unless they are suppressed using Python command-line 409 options or the :mod:`warnings` API, any such warnings will be written to 410 ``sys.stderr`` (*not* ``wsgi.errors``, unless they happen to be the same 411 object). 412 413 Example usage:: 414 415 from wsgiref.validate import validator 416 from wsgiref.simple_server import make_server 417 418 # Our callable object which is intentionally not compliant to the 419 # standard, so the validator is going to break 420 def simple_app(environ, start_response): 421 status = '200 OK' # HTTP Status 422 headers = [('Content-type', 'text/plain')] # HTTP Headers 423 start_response(status, headers) 424 425 # This is going to break because we need to return a list, and 426 # the validator is going to inform us 427 return "Hello World" 428 429 # This is the application wrapped in a validator 430 validator_app = validator(simple_app) 431 432 httpd = make_server('', 8000, validator_app) 433 print "Listening on port 8000...." 434 httpd.serve_forever() 435 436 437:mod:`wsgiref.handlers` -- server/gateway base classes 438------------------------------------------------------ 439 440.. module:: wsgiref.handlers 441 :synopsis: WSGI server/gateway base classes. 442 443 444This module provides base handler classes for implementing WSGI servers and 445gateways. These base classes handle most of the work of communicating with a 446WSGI application, as long as they are given a CGI-like environment, along with 447input, output, and error streams. 448 449 450.. class:: CGIHandler() 451 452 CGI-based invocation via ``sys.stdin``, ``sys.stdout``, ``sys.stderr`` and 453 ``os.environ``. This is useful when you have a WSGI application and want to run 454 it as a CGI script. Simply invoke ``CGIHandler().run(app)``, where ``app`` is 455 the WSGI application object you wish to invoke. 456 457 This class is a subclass of :class:`BaseCGIHandler` that sets ``wsgi.run_once`` 458 to true, ``wsgi.multithread`` to false, and ``wsgi.multiprocess`` to true, and 459 always uses :mod:`sys` and :mod:`os` to obtain the necessary CGI streams and 460 environment. 461 462 463.. class:: BaseCGIHandler(stdin, stdout, stderr, environ, multithread=True, multiprocess=False) 464 465 Similar to :class:`CGIHandler`, but instead of using the :mod:`sys` and 466 :mod:`os` modules, the CGI environment and I/O streams are specified explicitly. 467 The *multithread* and *multiprocess* values are used to set the 468 ``wsgi.multithread`` and ``wsgi.multiprocess`` flags for any applications run by 469 the handler instance. 470 471 This class is a subclass of :class:`SimpleHandler` intended for use with 472 software other than HTTP "origin servers". If you are writing a gateway 473 protocol implementation (such as CGI, FastCGI, SCGI, etc.) that uses a 474 ``Status:`` header to send an HTTP status, you probably want to subclass this 475 instead of :class:`SimpleHandler`. 476 477 478.. class:: SimpleHandler(stdin, stdout, stderr, environ, multithread=True, multiprocess=False) 479 480 Similar to :class:`BaseCGIHandler`, but designed for use with HTTP origin 481 servers. If you are writing an HTTP server implementation, you will probably 482 want to subclass this instead of :class:`BaseCGIHandler`. 483 484 This class is a subclass of :class:`BaseHandler`. It overrides the 485 :meth:`__init__`, :meth:`get_stdin`, :meth:`get_stderr`, :meth:`add_cgi_vars`, 486 :meth:`_write`, and :meth:`_flush` methods to support explicitly setting the 487 environment and streams via the constructor. The supplied environment and 488 streams are stored in the :attr:`stdin`, :attr:`stdout`, :attr:`stderr`, and 489 :attr:`environ` attributes. 490 491 492.. class:: BaseHandler() 493 494 This is an abstract base class for running WSGI applications. Each instance 495 will handle a single HTTP request, although in principle you could create a 496 subclass that was reusable for multiple requests. 497 498 :class:`BaseHandler` instances have only one method intended for external use: 499 500 501 .. method:: BaseHandler.run(app) 502 503 Run the specified WSGI application, *app*. 504 505 All of the other :class:`BaseHandler` methods are invoked by this method in the 506 process of running the application, and thus exist primarily to allow 507 customizing the process. 508 509 The following methods MUST be overridden in a subclass: 510 511 512 .. method:: BaseHandler._write(data) 513 514 Buffer the string *data* for transmission to the client. It's okay if this 515 method actually transmits the data; :class:`BaseHandler` just separates write 516 and flush operations for greater efficiency when the underlying system actually 517 has such a distinction. 518 519 520 .. method:: BaseHandler._flush() 521 522 Force buffered data to be transmitted to the client. It's okay if this method 523 is a no-op (i.e., if :meth:`_write` actually sends the data). 524 525 526 .. method:: BaseHandler.get_stdin() 527 528 Return an input stream object suitable for use as the ``wsgi.input`` of the 529 request currently being processed. 530 531 532 .. method:: BaseHandler.get_stderr() 533 534 Return an output stream object suitable for use as the ``wsgi.errors`` of the 535 request currently being processed. 536 537 538 .. method:: BaseHandler.add_cgi_vars() 539 540 Insert CGI variables for the current request into the :attr:`environ` attribute. 541 542 Here are some other methods and attributes you may wish to override. This list 543 is only a summary, however, and does not include every method that can be 544 overridden. You should consult the docstrings and source code for additional 545 information before attempting to create a customized :class:`BaseHandler` 546 subclass. 547 548 Attributes and methods for customizing the WSGI environment: 549 550 551 .. attribute:: BaseHandler.wsgi_multithread 552 553 The value to be used for the ``wsgi.multithread`` environment variable. It 554 defaults to true in :class:`BaseHandler`, but may have a different default (or 555 be set by the constructor) in the other subclasses. 556 557 558 .. attribute:: BaseHandler.wsgi_multiprocess 559 560 The value to be used for the ``wsgi.multiprocess`` environment variable. It 561 defaults to true in :class:`BaseHandler`, but may have a different default (or 562 be set by the constructor) in the other subclasses. 563 564 565 .. attribute:: BaseHandler.wsgi_run_once 566 567 The value to be used for the ``wsgi.run_once`` environment variable. It 568 defaults to false in :class:`BaseHandler`, but :class:`CGIHandler` sets it to 569 true by default. 570 571 572 .. attribute:: BaseHandler.os_environ 573 574 The default environment variables to be included in every request's WSGI 575 environment. By default, this is a copy of ``os.environ`` at the time that 576 :mod:`wsgiref.handlers` was imported, but subclasses can either create their own 577 at the class or instance level. Note that the dictionary should be considered 578 read-only, since the default value is shared between multiple classes and 579 instances. 580 581 582 .. attribute:: BaseHandler.server_software 583 584 If the :attr:`origin_server` attribute is set, this attribute's value is used to 585 set the default ``SERVER_SOFTWARE`` WSGI environment variable, and also to set a 586 default ``Server:`` header in HTTP responses. It is ignored for handlers (such 587 as :class:`BaseCGIHandler` and :class:`CGIHandler`) that are not HTTP origin 588 servers. 589 590 591 .. method:: BaseHandler.get_scheme() 592 593 Return the URL scheme being used for the current request. The default 594 implementation uses the :func:`guess_scheme` function from :mod:`wsgiref.util` 595 to guess whether the scheme should be "http" or "https", based on the current 596 request's :attr:`environ` variables. 597 598 599 .. method:: BaseHandler.setup_environ() 600 601 Set the :attr:`environ` attribute to a fully-populated WSGI environment. The 602 default implementation uses all of the above methods and attributes, plus the 603 :meth:`get_stdin`, :meth:`get_stderr`, and :meth:`add_cgi_vars` methods and the 604 :attr:`wsgi_file_wrapper` attribute. It also inserts a ``SERVER_SOFTWARE`` key 605 if not present, as long as the :attr:`origin_server` attribute is a true value 606 and the :attr:`server_software` attribute is set. 607 608 Methods and attributes for customizing exception handling: 609 610 611 .. method:: BaseHandler.log_exception(exc_info) 612 613 Log the *exc_info* tuple in the server log. *exc_info* is a ``(type, value, 614 traceback)`` tuple. The default implementation simply writes the traceback to 615 the request's ``wsgi.errors`` stream and flushes it. Subclasses can override 616 this method to change the format or retarget the output, mail the traceback to 617 an administrator, or whatever other action may be deemed suitable. 618 619 620 .. attribute:: BaseHandler.traceback_limit 621 622 The maximum number of frames to include in tracebacks output by the default 623 :meth:`log_exception` method. If ``None``, all frames are included. 624 625 626 .. method:: BaseHandler.error_output(environ, start_response) 627 628 This method is a WSGI application to generate an error page for the user. It is 629 only invoked if an error occurs before headers are sent to the client. 630 631 This method can access the current error information using ``sys.exc_info()``, 632 and should pass that information to *start_response* when calling it (as 633 described in the "Error Handling" section of :pep:`333`). 634 635 The default implementation just uses the :attr:`error_status`, 636 :attr:`error_headers`, and :attr:`error_body` attributes to generate an output 637 page. Subclasses can override this to produce more dynamic error output. 638 639 Note, however, that it's not recommended from a security perspective to spit out 640 diagnostics to any old user; ideally, you should have to do something special to 641 enable diagnostic output, which is why the default implementation doesn't 642 include any. 643 644 645 .. attribute:: BaseHandler.error_status 646 647 The HTTP status used for error responses. This should be a status string as 648 defined in :pep:`333`; it defaults to a 500 code and message. 649 650 651 .. attribute:: BaseHandler.error_headers 652 653 The HTTP headers used for error responses. This should be a list of WSGI 654 response headers (``(name, value)`` tuples), as described in :pep:`333`. The 655 default list just sets the content type to ``text/plain``. 656 657 658 .. attribute:: BaseHandler.error_body 659 660 The error response body. This should be an HTTP response body string. It 661 defaults to the plain text, "A server error occurred. Please contact the 662 administrator." 663 664 Methods and attributes for :pep:`333`'s "Optional Platform-Specific File 665 Handling" feature: 666 667 668 .. attribute:: BaseHandler.wsgi_file_wrapper 669 670 A ``wsgi.file_wrapper`` factory, or ``None``. The default value of this 671 attribute is the :class:`FileWrapper` class from :mod:`wsgiref.util`. 672 673 674 .. method:: BaseHandler.sendfile() 675 676 Override to implement platform-specific file transmission. This method is 677 called only if the application's return value is an instance of the class 678 specified by the :attr:`wsgi_file_wrapper` attribute. It should return a true 679 value if it was able to successfully transmit the file, so that the default 680 transmission code will not be executed. The default implementation of this 681 method just returns a false value. 682 683 Miscellaneous methods and attributes: 684 685 686 .. attribute:: BaseHandler.origin_server 687 688 This attribute should be set to a true value if the handler's :meth:`_write` and 689 :meth:`_flush` are being used to communicate directly to the client, rather than 690 via a CGI-like gateway protocol that wants the HTTP status in a special 691 ``Status:`` header. 692 693 This attribute's default value is true in :class:`BaseHandler`, but false in 694 :class:`BaseCGIHandler` and :class:`CGIHandler`. 695 696 697 .. attribute:: BaseHandler.http_version 698 699 If :attr:`origin_server` is true, this string attribute is used to set the HTTP 700 version of the response set to the client. It defaults to ``"1.0"``. 701 702 703Examples 704-------- 705 706This is a working "Hello World" WSGI application:: 707 708 from wsgiref.simple_server import make_server 709 710 # Every WSGI application must have an application object - a callable 711 # object that accepts two arguments. For that purpose, we're going to 712 # use a function (note that you're not limited to a function, you can 713 # use a class for example). The first argument passed to the function 714 # is a dictionary containing CGI-style environment variables and the 715 # second variable is the callable object (see PEP 333). 716 def hello_world_app(environ, start_response): 717 status = '200 OK' # HTTP Status 718 headers = [('Content-type', 'text/plain')] # HTTP Headers 719 start_response(status, headers) 720 721 # The returned object is going to be printed 722 return ["Hello World"] 723 724 httpd = make_server('', 8000, hello_world_app) 725 print "Serving on port 8000..." 726 727 # Serve until process is killed 728 httpd.serve_forever() 729