5.8、Python

2017年11月26日 11:35 | 4410次浏览

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_frameworksDjango是其中比较流行的一种。

1. WSGI的官方文档:https://www.python.org/dev/peps/pep-3333/



小说《我是全球混乱的源头》

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程