应用程序对象必须接受两个固定参数,为了方便说明我们不妨把他们命名为 environstart_response ,但并非必须取这个名字。服务器或gateway必须使用这两个参数来调用应用程序对象 ( 就象上面展示的那样, 像这样调用 result = application(environ,start_response) )

The application object must accept two positional arguments. For the sake of illustration, we have named them environ and start_response, but they are not required to have these names. A server or gateway must invoke the application object using positional (not keyword) arguments. (E.g. by calling result = application(environ,start_response) as shown above.)

environ 参数是个字典,其中包含的是 CGI 风格的环境变量。这个对象必须是一个 python 内置的字典对象 (不能是其子类、UserDict或其他对字典对象的模仿) ,应用程序可以任意修改这个字典, environ 还应该包含一些 WSGI 需要的特定变量 (在后面的节里还会描述) ,还可以包含一些依据一定的命名规范的服务器特定的扩展变量, 命名规范在后面还会有描述。

The environ parameter is a dictionary object, containing CGI-style environment variables. This object must be a builtin Python dictionary (not a subclass, UserDict or other dictionary emulation), and the application is allowed to modify the dictionary in any way it desires. The dictionary must also include certain WSGI-required variables (described in a later section), and may also include server-specific extension variables, named according to a convention that will be described below.

参数 start_response 是一个接受两个必需的固定参数和一个可选参数的 callable 对象. 为便于说明, 我们把这三个参数分别命名为: status, response_headers, 和 exc_info, 当然你也可以给他们起其他名字. 应用程序必需使用固定参数调用 start_response (比如: start_response(status,response_headers))

The start_response parameter is a callable accepting two required positional arguments, and one optional argument. For the sake of illustration, we have named these arguments status, response_headers, and exc_info, but they are not required to have these names, and the application must invoke the start_response callable using positional arguments (e.g. start_response(status,response_headers)).

参数 status 是一个形如 "999 Message here" 的表示状态的字符串。而 response_headers 参数是一个描述 http 响应头的列表, 其中每一个元素都是像 (header_name,header_value) 这样的元组。可选的 exc_info 参数会在后面的 start_response() callable错误处理 两节中进行描述,该参数只有在应用程序产生了错误并希望在浏览器上显示错误信息的时候才用得上。

The status parameter is a status string of the form "999 Message here", and response_headers is a list of (header_name,header_value) tuples describing the HTTP response header. The optional exc_info parameter is described below in the sections on The start_response() Callable and Error Handling. It is used only when the application has trapped an error and is attempting to display an error message to the browser.

start_response callable 必须返回一个 write(body_data) callable,该 callable 接受一个可选参数:一个将会被作为 http body 一部分输出的字符串. (注意:提供 write() callable 只是为了支持几个现有框架急需的输出API,新的应用程序或框架应尽量避免使用,详细情况请看 Buffering and Streaming 一节。)

The start_response callable must return a write(body_data) callable that takes one positional parameter: a string to be written as part of the HTTP response body. (Note: the write() callable is provided only to support certain existing frameworks' imperative output APIs; it should not be used by new applications or frameworks if it can be avoided. See the Buffering and Streaming section for more details.)

当被服务器调用的时候, 应用程序对象必须返回一个能产生零或多个字符串的 iterable , 这可以有好几种实现方法, 比如返回一个字符串的列表,或者应用程序本身就是一个产生字符串的生成器, 或者应用程序本身是一个类 而他的实例是 iterable . 不管它是怎么实现,应用程序对象总是必须返回一个能产生零或多个字符串的 iterable 。

When called by the server, the application object must return an iterable yielding zero or more strings. This can be accomplished in a variety of ways, such as by returning a list of strings, or by the application being a generator function that yields strings, or by the application being a class whose instances are iterable. Regardless of how it is accomplished, the application object must always return an iterable yielding zero or more strings.

服务器必须将产生的字符串以一种无缓冲的方式传输到客户端,每次传输完一个字符串再去获取下一个。(换句话说,应用程序应该自己实现缓冲,更多关于应用程序输出必须如何处理的细节请阅读后面的 Buffering and Streaming_ 节。)

The server or gateway must transmit the yielded strings to the client in an unbuffered fashion, completing the transmission of each string before requesting another one. (In other words, applications should perform their own buffering. See the Buffering and Streaming section below for more on how application output must be handled.)

服务器或gateway应该把应用程序产生的字符串当字节流对待:特别地,他必须保证行尾是未修改过的。应用程序负责保证输出的这些字符串的编码是与客户端匹配的 ( 服务器/gateway 可能会附加 HTTP 传送编码,或者为了实现一些http的特性而对内容进行其他的转换比如 byte-range transmission , 更多这方面的细节请看后面的 Other HTTP Features )

The server or gateway should treat the yielded strings as binary byte sequences: in particular, it should ensure that line endings are not altered. The application is responsible for ensuring that the string(s) to be written are in a format suitable for the client. (The server or gateway may apply HTTP transfer encodings, or perform other transformations for the purpose of implementing HTTP features such as byte-range transmission. See Other HTTP Features, below, for more details.)

如果调用 len(iterable) 成功的话, 服务器便会假定返回的结果是正确的。也就是说, 只要应用程序返回的 iterable 提供了有效的 __len__() 方法,就可以肯定它返回的结果是正确的. (关于通常情况下这个方法应该如何使用的问题请阅读 Handling the Content-Length Header 一节 )

If a call to len(iterable) succeeds, the server must be able to rely on the result being accurate. That is, if the iterable returned by the application provides a working len() method, it must return an accurate result. (See the Handling the Content-Length Header section for information on how this would normally be used.)

如果应用程序返回的 iterable 拥有 close() 方法, 则不管该请求是正常结束的还是由于出错而终止的, 服务器/gateway 都 *必须* 在结束该请求之前调用这个方法,(这是用来支持应用程序对资源的释放的, 这个协议是特别用来提供对 PEP 325 的生成器 和 其他带有 close() 方法的 iterable 的支持 )

If the iterable returned by the application has a close() method, the server or gateway must call that method upon completion of the current request, whether the request was completed normally, or terminated early due to an error. (This is to support resource release by the application. This protocol is intended to complement PEP 325's generator support, and other common iterables with close() methods.

(注意:应用程序必须在 iterable 产生第一个 body 字符串之间调用 start_response() callable, 这样服务器才能在发送任何 body 内容之前发送 response header, 不过这个步骤也可以在 iterable 执行第一次迭代的时候执行,所以服务器不能假定在开始迭代之前 start_response() 一定被调用过了)

(Note: the application must invoke the start_response() callable before the iterable yields its first body string, so that the server can send the headers before any body content. However, this invocation may be performed by the iterable's first iteration, so servers must not assume that start_response() has been called before they begin iterating over the iterable.)

最后, 服务器和gateway 绝不能直接使用应用程序返回的 iterable 的任何其他的属性, 除非是针对该 服务器或gateway 特定的情形, 比如 wsgi.file_wrapper 返回的 file wrapper (阅读 Optional Platform-Specific File Handling)。通常, 只能访问这里指定的属性, 或者也可以通过 PEP 234 iteration APIs 进行访问。

Finally, servers and gateways must not directly use any other attributes of the iterable returned by the application, unless it is an instance of a type specific to that server or gateway, such as a "file wrapper" returned by wsgi.file_wrapper (see Optional Platform-Specific File Handling). In the general case, only attributes specified here, or accessed via e.g. the PEP 234 iteration APIs are acceptable.

1. environ 变量

2. start_response() callable

3. Buffering and Streaming