Python核心编程(第3版)
第2 部分 Web开发

第10章 Web编程:CGI和WSGI

章节主张:CGI 与 WSGI 章的真正价值,是把“一个 Web 请求如何进入你的 Python 代码”讲明白。

中文释读:哪怕未来不再直接写 CGI,理解 WSGI 这类网关接口也会让你对框架、中间件、部署和请求生命周期更有把握。

章节知识路线

  1. 10.1 简介
  2. 10.2 帮助Web服务器处理客户端数据
  3. 10.3 构建CGI应用程序
  4. 10.4 在CGI中使用Unicode
  5. 10.5 高级CGI

关键论点

  • CGI 展示了最原始的 Web 应用接口。
  • WSGI 把 Python 应用与服务器的边界标准化。
  • 表单、上传、cookie 等部分直接对应真实世界输入处理。

行动清单

  • 画清请求进入应用再返回响应的路径。
  • 表单输入先校验后使用。
  • 中间件与应用职责要区分。

源章节深读

10.1 简介

解决的问题:这一节解决的是“10.1 简介在真实应用里到底扮演什么角色”。

把 10.1 简介 放回本章上下文,它更像是 结构化数据交换与系统边界 的一个具体落点。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 10.1 简介 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

10.2 帮助Web服务器处理客户端数据

解决的问题:这一节解决的是“10.2 帮助Web服务器处理客户端数据在真实应用里到底扮演什么角色”。

346 第 2 部分 Web 开发 10.1 简介 本章是 Web 编程方面的入门章节,将对 Python 网络编程做快速而广泛的概述,从 Web 浏览到创建用户反馈表单,从识别 URL 到生成动态 Web 页面。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 10.2 帮助Web服务器处理客户端数据 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

346 第 2 部分 Web 开发 10.1 简介 本章是 Web 编程方面的入门章节,将对 Python 网络编程做快速而广泛的概述,从 Web 浏览到创建用户反馈表单,从识别 URL 到生成动态 Web 页面。 本章首先介绍通用网关接口 (Common Gateway Interface CGI),接着讨论 Web 服务器网关接口(Web Server Gateway Interface, WSGI)。 10.2 帮助 Web 服务器处理客户端数据 本节将介绍 CGI,包括 CGI 的含义、出现原因,以及与 Web 服务器的工作方式,接着介 绍如何使用 Python 创建 CGI 应用。

10.3 构建CGI应用程序

解决的问题:这一节解决的是“10.3 构建CGI应用程序在真实应用里到底扮演什么角色”。

第 10 章 Web 编程:CGI 和 WSGI 349 在本章的前半部分会有很多地方能用到这个模块。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 10.3 构建CGI应用程序 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

第 10 章 Web 编程:CGI 和 WSGI 349 在本章的前半部分会有很多地方能用到这个模块。 但在刚开始的简单例子中不会用到这 两行代码。 这里先介绍用笨方法查看并调试“内部服务器错误”消息。

10.4 在CGI中使用Unicode

解决的问题:这一节解决的是“10.4 在CGI中使用Unicode在真实应用里到底扮演什么角色”。

362 第 2 部分 Web 开发 10.4 在 CGI 中使用 Unicode Core Python Programming 或 Core Python Language Fundamentals 的第 6 章介绍了 Unicode 字符串的使用。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 10.4 在CGI中使用Unicode 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

362 第 2 部分 Web 开发 10.4 在 CGI 中使用 Unicode Core Python Programming 或 Core Python Language Fundamentals 的第 6 章介绍了 Unicode 字符串的使用。 其中一节给出了一个简单的例子脚本,即接受 Unicode 字符串,写入一个文 件,并重新读出来。 而这里将演示一个可以输出 Unicode 字串符的简单 CGI 脚本。

10.5 高级CGI

解决的问题:这一节解决的是“10.5 高级CGI在真实应用里到底扮演什么角色”。

364 第 2 部分 Web 开发 10.5 高级 CGI 现在来看看 CGI 编程的高级方面。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 10.5 高级CGI 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

364 第 2 部分 Web 开发 10.5 高级 CGI 现在来看看 CGI 编程的高级方面。 这包括 cookie 的使用(保存在客户端的缓存数据), 同一个 CGI 字段的多个值,以及用 multipart 表单提交方式实现文件上传。 为了节省篇幅,将 会在同一个程序中展示这三个特性。

10.6 WSGI简介

解决的问题:这一节解决的是“10.6 WSGI简介在真实应用里到底扮演什么角色”。

第 10 章 Web 编程:CGI 和 WSGI 373 如果使用 cookie 来保管数据,就可以避免使用任何类型的 CGI 字段。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 10.6 WSGI简介 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

第 10 章 Web 编程:CGI 和 WSGI 373 如果使用 cookie 来保管数据,就可以避免使用任何类型的 CGI 字段。 在本章之前的示例 中,将这些值作为 CGI 变量传递。 读者会注意到获取这些数据的代码 没有调用 CGI 处理,这意味着数据并非来自 FieldStorage 对象。

辨别题

为什么理解 WSGI 对现代 Python Web 开发仍有意义?

本章图版学习路径

10.1 简介

WSGI 接口理解