3.4.4 Python
Python是一门通用编程语言,由Van Rossum发明,在1994年达到了1.0版。它的应用领域十分广泛,服务器编程只是其中一部分。
关于Python语言本身,有很多优秀的读物可供参考。在此作者推荐OReilly出版的《Learning Python, 5th Edition》。这本书内容全面,也相当厚重,对有经验的开发者来说也许显得啰嗦。对后者我推荐《Python in a Nutshell》,仍然由OReilly出版。
Python在服务器端的编程主要依赖WSGI(Web Server Gateway Interface )。它是一个Python的规范,定义了服务器和应用程序的交互接口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是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。Django是其中比较流行的一种。
1. WSGI的官方文档:https://www.python.org/dev/peps/pep-3333/ ↩