Flask 0.1版本的代码很简洁,加上注释只有600多行。本文以 0.1版本为例,简单探讨一下Flask 的实现。
一、Werkzug
Flask源码简短,主要原因之一是,下层的 Werkzug 库完成了大部分的工作。Werkzug 是一个用于实现 WSGI (什么是wsgi)应用的工具集。我们来看一下如何用werkzug来实现一个简易的web应用。
1.Response与Request
from werkzeug.wrappers import Request, Response
Request 类是对WSGI 传入的 environ
参数的封装,包含了HTTP请求的各种属性,如method、header、path 等等。Response 类则相反,是对返回数据的封装,比如我们返回一个“Hello World”:
response = Response("Hello World\n")
按照WSGI的要求,Web应用必须回调传入的start_response
参数;这里Response 类已经帮我们做好这件事了:
def __call__(self, environ, start_response):
"""Process this response as WSGI application.
:param environ: the WSGI environment.
:param start_response: the response callable provided by the WSGI
server.
:return: an application iterator
"""
app_iter, status, headers = self.get_wsgi_response(environ)
start_response(status, headers) # 回调
return app_iter
同时,由于实现了__call__
方法,可见Response 也是可调用对象。
2.一个简单的Web应用
我们来用Werkzug构建一个Web应用:
class WebApp:
def __init__(self):
self.url_map = Map([Rule('/hello', endpoint='hello')])
def __call__(self, environ, start_response):
adapter = self.url_map.bind_to_environ(environ)
endpoint, args = adapter.match(path_info="/hello", method="GET")
request = Request(environ)
if request.method ==