用 Python WSGI 混和并匹配 Web 组件
2010-09-22 11:13:19 来源:WEB开发网safexhtml 类是完整的中间件实现。每个实例都是一个可调用对象,因为这个类定义了专门的 __call__ 方法。向服务器传递类的实例,传递包装成初始化器 __init__ 的应用程序。如果把 safexhtml 链到另一个中间件,包装的应用程序可能也是另一个中间件实例。当中间件作为向服务器请求的结果被调用时,这个类首先检查客户机发送的 Accept 报头,看它是否包括正式的 XHTML 媒体类型。如果是这样的话(xhtml_ok 标志),那么发送 XHTML 就是安全的,中间件就不在请求中做任何有意义的事情。
当客户机不能处理 XHTML 的时候,这个类定义专门的嵌套函数 start_response_wrapper,这个函数的作用是检查来自应用程序的响应报头,看响应是否是 XHTML。如果是,这个响应需要翻译成普通的 HTML,在这个环境中以 safexhtml.active 标记这个事实。对于这个标志,使用这个环境的一个原因是因为它处理将标志返回到其余的中间件代码的范围问题。记住,在应用程序选择的时间异步调用 start_response_wrapper,它可以技巧地管理必要的中间件状态。
使用这个环境的另一个原因是向下沿着 WSGI 堆栈通信时,内容已经修改。如果需要翻译响应体,不仅要运行 start_response_wrapper 设置 safexhtml.active,而且它还把响应媒体类型改成 text/html 并删除任何 Content-Length 报头,因为翻译会改变响应体的长度,它必须向下游重新计算,这可能由服务器执行。
一旦应用程序开始发送响应体,如果需要翻译,它就把数据收集到 response_blocks 列表中。应用程序可能以块的形式发送响应,但是为了保持代码简单,它仅针对完整的 XHTML 输入运行翻译机制。可是,WSGI 规则规定应用程序每次产生块的时候,中间件必须向服务器传送一些东西。传递空字符串也是可以的,这就是它应该做的。一旦应用程序完成,它就固定响应体并通过翻译代码处理响应,然后用最后一个字符串产生完整的输出结果。
更多精彩
赞助商链接