# 3.4.4 Python
### 3.4.4 Python
Python是一门通用编程语言,由Van Rossum发明,在1994年达到了1.0版。它的应用领域十分广泛,服务器编程只是其中一部分。
关于Python语言本身,有很多优秀的读物可供参考。在此作者推荐OReilly出版的[《Learning Python, 5th Edition》](http://shop.oreilly.com/product/0636920028154.do)。这本书内容全面,也相当厚重,对有经验的开发者来说也许显得啰嗦。对后者我推荐[《Python in a Nutshell》](http://shop.oreilly.com/product/0636920012610.do?sortby=publicationDate),仍然由OReilly出版。
Python在服务器端的编程主要依赖**WSGI(Web Server Gateway Interface )**。它是一个Python的规范,定义了服务器和应用程序的交互接口[1](#fn_1)。这里“服务器”是指接受客户端(如浏览器)HTTP请求的程序,而“应用程序”是指(由你编写的)响应HTTP请求的程序。Python的现代Web编程框架都基于WSGI。
一个WSGI的Hello, world程序如下:
```
from wsgiref.simple_server import make_server
def app(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ['<p>Hello, WSGI!</p>']
httpd = make_server('', 8080, app)
httpd.serve_forever()
```
其中,函数app就是我们的应用程序(WSGI应用程序不仅可以是函数,还可以是具有**call**方法的对象,如后例)。按照WSGI规范,它有两个参数:
- environ是一个dict类型对象,与CGI的环境变量类似,包含了HTTP请求在内的输入
- start\_response是一个函数,app必须调用它来返回HTTP应答状态代码和头部(header)
app返回一个iterable对象,如一个list,作为HTTP应答的消息主体(message body)。
[wsgiref](https://docs.python.org/2/library/wsgiref.html)是Python的一个WSGI工具包,包括一个供开发、测试用的服务器,由make\_server得到。
假设程序保存在文件hello.py中,在命令行上执行
```
python hello.py
```
就启动了我们的WSGI应用程序。在浏览器里访问`http://localhost:8080/`,即可看到:
```
Hello, WSGI!
```
WSGI有一个强大的功能叫做**中间件(middleware)**。举例来说:
```
from wsgiref.simple_server import make_server
def app(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ['<p>Hello, WSGI!</p>']
class Middleware:
def __init__(self, app):
self.wrapped_app = app
def __call__(self, environ, start_response):
result = self.wrapped_app(environ, start_response)
result.insert(0, '<h1>Middleware</h1>')
return result
httpd = make_server('', 8080, Middleware(app))
httpd.serve_forever()
```
其中,Middleware对象就是一个中间件,它接受服务器的调用参数,在内部调用下级应用,并返回结果给上级服务器(也能是另一个中间件!)。因此,中间件可以检查、修改应用程序的输入、输出,进而实现各种功能,如session,访问权限控制,日志,错误处理等等。
了解WSGI有助于深刻领会高级的Python Web编程框架,以及更好地使用middleware。关于Python Web编程和WSGI的更多内容,读者可参考 <https://docs.python.org/2/howto/webservers.html>
此外,这个Wiki列出了一些使用WSGI的编程框架[https://en.wikipedia.org/wiki/Web\_Server\_Gateway\_Interface#WSGI-compatible\_applications\_and\_frameworks](https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface#WSGI-compatible_applications_and_frameworks)。[Django](https://www.djangoproject.com/)是其中比较流行的一种。
> 1. WSGI的官方文档:<https://www.python.org/dev/peps/pep-3333/>[↩](#reffn_1 "Jump back to footnote [1] in the text.")
- 前言
- 1 Web概述
- 1.1 什么是Web
- 1.2 超文本和超链接
- 1.3 URL
- 1.4 DNS
- 1.5 HTTP
- 1.5.1 客户端请求
- 1.5.2 服务器应答
- 1.5.3 进一步了解HTTP
- 1.6 HTTPS
- 2 Web浏览器
- 2.1 HTML
- 2.1.1 文档类型声明
- 2.1.2 标签和属性
- 2.1.3 文档结构
- 2.1.4 DOM
- 2.1.5 进一步了解HTML
- 2.2 CSS
- 2.2.1 样式与样式表
- 2.2.2 样式表语法
- 2.2.3 级联样式表
- 2.2.4 进一步了解CSS
- 2.3 JavaScript
- 2.3.1 script标签
- 2.3.2 操纵DOM
- 2.3.3 jQuery
- 2.3.4 进一步了解JavaScript
- 2.4 Ajax
- 2.5 移动设备与响应式Web设计
- 3 Web服务器
- 3.1 方法与资源
- 3.2 状态代码
- 3.3 静态内容与动态内容
- 3.4 编程语言与技术
- 3.4.1 CGI
- 3.4.2 PHP
- 3.4.3 Java
- 3.4.4 Python
- 3.4.5 Ruby
- 3.4.6 Node.js
- 3.5 RESTful Web API
- 3.6 服务器架构
- 3.7 Web缓存
- 3.8 服务器推送
- 4 数据库
- 4.1 关系型数据库
- 4.2 NoSQL数据库
- 5 Web服务器的其他组件
- 5.1 Cron
- 5.2 消息队列
- 5.3 邮件服务器
- 6 开发工具与技术
- 6.1 Git
- 6.1.1 Git基础操作
- 6.1.2 Git基本原理
- 6.1.3 进一步了解Git
- 6.2 敏捷开发