Letter
前言:python-web WSGI框架
参考源码 bottle.py
参考书籍 《Http权威指南》
一边学习一边更新,记录点点滴滴
以WSGI应用程序形式编写简单HTTP服务的原理不再赘述,大致实现如下
def app(environ, start_response):
start_response('返回的header')
return '返回的body'
Letter0.0
1.0 实现最简单的web框架
我们要实现一个函数或者一个类也可以,只要它支持调用(environ, start_response),就可以实现本节的功能。
先新建一个Letter.py文件
def WSGIHandler(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
output = 'hello Letter'
return [output.encode("utf-8")]
此处我们先把报文首部和报文主体写成固定值。
这时我们已经可以启动服务,并执行该函数了
server = make_server('127.0.0.1', 9999, WSGIHandler)
server.server_forerver()
不过太过简陋,不方便后续拓展,我们不这样写
# 整个Letter.py的内容
####################################################
def WSGIHandler(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
output = 'hello Letter'
return [output.encode("utf-8")]
####################################################
####################################################
# Server adapter 定义一个服务适配器
class ServerAdapter:
def __init__(self, host='127.0.0.1', port=9999, **kwargs):
self.host = host
self.port = port
self.options = kwargs
def __repr__(self):
return "%s (%s:%d)" % (self.__class__.__name__, self.host, self.port)
# handler就是服务要执行的应用,也就是WSGIHandler
def run(self, handler):
pass
class WSGIRefServer(ServerAdapter):
# 实现run函数
def run(self, handler):
from wsgiref.simple_server import make_server
srv = make_server(self.host, self.port, handler)
srv.serve_forever()
# 最后定义一个启动函数,可以起任意名字
def run(server=WSGIRefServer, host='127.0.0.1', port=9999, **kwagrs):
if isinstance(server, type) and issubclass(server, ServerAdapter):
server = server(host=host, port=port, **kwagrs)
try:
server.run(WSGIHandler)
except KeyboardInterrupt:
print ("Shuting down...")
这部分是参考bottle.py源码的,虽然现在看起来写的很复杂。
测试
再新建一个 testLetter.py
# testLetter.py
from Letter import run
run()
python testLetter.py
curl "127.0.0.1:9999"
Hello Letter
这时候,你不管输入什么url,返回值都是固定的
curl "127.0.0.1:9999/hello"
curl "127.0.0.1:9999/test/123"
Hello Letter
1.1路由
先给出本节的