django ### wsgiref.handlers   这个模块是WSGI服务器和网关的实现。只要给予一个类CGI的环境,以及输入、输出和错误流,就可以用WSGI应用程序处理绝大部分的网络连接。 * __class__ wsgiref.handlers.__CGIHandler__ 使用sys.stdin、sys.stdout和sys.stderr流的基于CGI的调用。可以用在你想以一个CGI脚本来运行你写的WSGI应用程序时。它会直接调用```CGIHandler().run(app)```,这里的app就是你想调用的对象。 这个class是把wsgi.run_once设置为True、把wsgi.multithread设置为False,而且总是使用sys和os来获取必要的CGI流和环境变量的BaseCGIHandler的派生类。 * __class__ wsgiref.handlers.__BaseCGIHandler(stdin, stdout, stderr, environ, multithread=True, multiprocess=False)__ 与CGIHandler类似,但不使用sys和os,而是显式的指定CGI环境和IO流。*multithread*和*multiprocess*的值是用来给任何通过此实例来运行的应用程序设置*wsgi.multithread*和*wsgi.multiprocess*标志位的。 这个类是一个随非HTTP "origin servers"软件而使用的SimpleHandler的派生类。如果你想写一个网关接口的实现,比如CGI、FastCGI、SCGI等,使用```Status: ```头来发送一个HTTP的状态码,那您肯定很想用这个实例而不是SimpleHandler的实例。 * __class__ wsgiref.handlers.__SimpleHandler(stdin, stdout, stderr, environ, multithread=True, multiprocess=False)__ 和上述BaseCGIHandler类似,但为了HTTP origin servers来设计的。如果你正在写一个HTTP服务器的实现,那使用这个类的实例就比BaseCGIHandler要好得多。 这个类基于BaseHandler,但覆写了__init__()、get_stdin()、get_stderr()、add_cgi_vars()、_write()和_flush()方法来支持通过这个构造器来显式设置环境和流。支持的环境和流被存储在stdin、stdout、stderr和environ属性里。 * __class__ wsgiref.handlers.__BaseHandler__ 这是一个用来运行WSGI应用程序的抽象类,虽然原则上你可以派生出一个类来复用,使得他能接收多个请求,但每个实例都应该只处理一个HTTP请求。 __BaseHandler__只有一个用于外部调用的方法: - run(*app*) 运行指定的WSGI应用程序,如*app*。 所有其他的方法都只被这个方法调用,用来辅助这个app的运行。这样从根本上可以定制处理过程。 - _write(*data*) 给字符串*data*做缓冲用来传送到client。如果这个方法发送了data,是OK的,BaseHandler只是区分了写和刷新的操作用于给特定的系统提升效率。 - _flush() 强制把缓冲区中的数据发送到client。 - get_stdin()/get_stderr() 返回WSGI请求正在处理之时对应的流。 - get_stdvars() 插入当前的请求中的CGI变量到environ的属性中。 另外,有一些方法和属性你肯定想重写它。这里仅列举出一部分,而且在打算基于BaseHandler来定制自己的类之前, 应该翻阅更官方的文档和源码来获得更确切的信息。 用来定制WSGI环境的属性和方法如下: - wsgi_multithread 用于wsgi.multithread的环境变量。在BaseHandler中默认为真,但亦可能为不同的默认值,因为有可能被别的派生类的构造器设置成了别的值。 - wsgi_multiprocess 用于wsgi.multiprocess环境变量。在BaseHandler中默认为真,但亦可能为不同的默认值,因为有可能被别的派生类的构造器设置成了别的值。 - wsgi_run_once 用于wsgi.run_once环境变量.在BaseHandler中默认为False,但CGIHandler中默认为True。 - os_environ 是每一个请求的WSGI环境中的默认环境变量。默认情况下它是当wsgiref.handlers被import的时候os.environ的拷贝,但派生类也可以在class或者实例层单独创建它们。需要注意的是,这个dict应该被设计成只读的,因为这个默认值是被多个类和实例共享的。 - server_software 如果设置origin_server属性,它的值将用于设置默认的SERVER_SOFTWARE WSGI环境变量,也会在HTTP响应中设置默认的```Server:```头. 他被非 HTTP origin servers忽略,比如BaseCGIHandler和CGIHandler。 - get_scheme() 用来返回当前请求的URL方案。默认的实现是使用guess_scheme()方法从wsgiref.util中判定当前的方案是“http”还是“https”,它是基于当前请求的environ变量的。 - setup_environ() 设置*environ*属性为fully-populated的WSGI环境。默认的实现是使用上述所有的方法加上get_stdin()、get_stderr()、和add_cgi_vars()方法,以及wsgi_file_wrapper属性。如果不存在SERVER_SOFTWARE的key,并且origin_server属性设置为真而且server_software是有值的,它也会插入这个key。 用来定制处理过程的方法和属性如下: - log_exception(*exc_info*) 给*exc_info*元组加上log。*exc_info*是(type, value, traceback) 元组,默认的实现是单纯的写入到wsgi.errors流中,然后flush。派生类可以重写这个方法来改变格式或者重定向输出、发送信息给管理员等等。 - traceback_limit 定义log_exception()中包含tracebacks输出信息的最大的帧的大小。如果为None,就会包含所有的帧。 - error_output(*environ, start_response*) 这个方法时一个WSGI应用程序来给用户产生一个error页面。它仅在发送Header之前发生错误时调用。 这个方法可以使用sys.exc_info()来进入当前错误信息。并且在被调用时,应当pass这条信息到start_response,在PEP 333中的“Error Handling”章节定义。 默认的实现就是使用```error_status```、```error_headers```和```error_body```属性来产生输出的页面。派生类可以重写它来产生更多动态的信息。 需要注意的是,从安全的角度来输出诊断信息是不推荐的,要做一些额外的工作来启用诊断输出。这就是为什么默认的实现没有包含任何东西的原因。 - error_status 用来做HTTP错误回复的状态码。这里应该是PEP 333中定义的一个字符串。默认是一个500的错误码和信息。 - error_headers 用于错误回复的HTTP headers。它应当是PEP 333中定义的WSGI响应头元组的list,比如[(name, value)]。默认的就是设置“content type”为“text/plain”。 - error_body 错误回复的body。应该是HTTP响应的body字符串,默认的是纯文本“A server error occurred. Please contact the administrator.”。 PEP 333中定义的“Optional Platform-Specific File Handling”特性相关的方法和属性: - wsgi_file_wrapper 为wsgi.file_wrapper的factory,或者为None。默认的值是wsgiref.util中的__FileWrapper__的属性。 - sendfile() 重写以实现平台特异的文件传输。这个方法只会在应用程序返回的值为wsgi_file_wrapper属性指定的类的实例时被调用。如果成功传送了一个文件它应该返回一个Ture,这样默认的传送代码就不会执行。默认的实现就是返回一个False。 其他的方法和属性: - origin_server 当handler的_write()和_flush()被用来与客户端直接连接,而不是通过类CGI的希望在特殊的```Status:```头中到HTTP状态码网关接口时,这个属性应该被设置为True。 在BaseHandler中,这个属性的默认值为True,在BaseCGIHandler和CGIHandler中为假。 - http_version 如果origin_server为真,这个字符串属性被用来给client设置HTTP版本。默认的是”1.0“。 ### 示例用法:   一个“Hello World”的WSGI应用程序: ``` from wsgiref.simple_server import make_server # Every WSGI application must have an application object - a callable # object that accepts two arguments. For that purpose, we're going to # use a function (note that you're not limited to a function, you can # use a class for example). The first argument passed to the function # is a dictionary containing CGI-style environment variables and the # second variable is the callable object (see PEP 333). def hello_world_app(environ, start_response): status = '200 OK' # HTTP Status headers = [('Content-type', 'text/plain')] # HTTP Headers start_response(status, headers) # The returned object is going to be printed return ["Hello World"] httpd = make_server('', 8000, hello_world_app) print "Serving on port 8000..." # Serve until process is killed httpd.serve_forever() ```