自己动手写一个简单的 python web framework
每天都使用 web 框架,实际上实现一个简单的 web 框架也是很容易的
写在前面
虽然这篇文章很简单,但是依然需要一些基础知识。
如果你不会Python,那就不用看了
如果你没有使用过多个pythonWebFramework,那么强烈建议你先去使用(Tornado、Flask、Bottle、web.py)
如果你没有读过PEP333/PEP3333,那么你很可能不知道所以然,因此强烈建议你先去看看PEP333,然后为了方便,这里还有一篇简单翻译,可以对照看PEP333 中文
好了,上面就是所有的基础知识。理清这些基础知识,就不用继续往下看了,直接上代码就可以了。
重中之重,处略看完代码之后,可以看
框架设计
我们的目标是用python原生的包来构建一个可以响应的web框架,它非常简单:支持url路由、get、post方法,支持cookie,其他内容实现并不困难,但这里只介绍最简单的。
我们要实现的web框架最终的helloworld可以这样写
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from easyweb import *
@get('/')
def index(request):
return 'hello world !'
runserver()
其中@get('/')获取了路由,并将路由注册到相应的处理函数中,request是浏览器发送的请求,数据由字典表示,可以在处理函数中自由调用。return语句将字符串响应到客户端,字符串可以是html格式的,这样就能在浏览器直接渲染成响应的网页。
上面几乎就是这篇文章要实现的所有功能。
服务器
于是我们就先从服务器说起吧,如果您使用过wsgiref这个包,强烈建议您去看看他的源代码,因为我的代码多数也是从里面copy过来。
我们要写的服务器只需要满足WSGI就行,如何从网络上读取或者写入数据不是我们的目标,所以我们使用了python内置的BaseHTTPserver,它将负责数据的最终传输。在他的上层,我们需要实现自己的服务器处理函数,经过我们我们服务器加工过的数据必须是符合WSGI标准的。
服务器就像一个容器,他把web框架放在里面,外面连接着网络。在网络数据请求到来的时候,要先经过服务器加工处理才能到框架/应用程序手里,我们常常看到的应用都是用框架写的,有些长得如下:
@get('/')
def index(request):
return 'hello world !'
其实,这里的request是已经被服务器处理过的数据了,不要认为浏览器那么聪明,一下子就发过来一个你需要的数据类型。
相信你已经看过PEP333了,一个典型的WSGI应用一般长这样:
def application(environ, start_response):
"""Simplest possible application object"""
status = "200 OK"
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return ['Hello world !\n']