新建一个python包kanado
kanado包中新建一个kanado.py文件
import time
def default(environ,start_response):
print('#'*100)
print(environ)
print('#'*100)
status = '200 OK'
response_headers = [('Content_Type'),'text/html']
start_response(status,response_headers)
return [('==Hello World from a simple WSGI application!--->%s\n'%time.ctime()).encode('utf-8')]
class Kanado:
def __init__(self,import_name):
self.import_name = import_name
self.uri_map = {
'default':default
}
def __call__(self,*args,**kwargs):
environ,start_response = args
url = environ['PATH_INFO']
app = self.uri_map.get(url,self.uri_map['default'])
return app(environ,start_response)
kanado包中的__init__.py
from .kanado import Kanado
__all__ = [
Kanado
]
解释:导包时首先执行__init__.py,其中__all__是用来限定哪些内容能被导入
目前的项目结构
2 代码执行流程
- run_app.py
from wsgiserver.wsgi_server import WSGIServer
from app import app
# from blog import app as application
import atexit
if __name__ == "__main__":
server = WSGIServer("127.0.0.1",8889,app) # application = app,即flask框架
atexit.register(server.server_close) # atexit模块主要的作用就是在程序即将结束之前执行的代码,atexit模块使用register函数用于注册程序退出时的回调函数,然后在回调函数中做一些资源清理的操作
print("running http://{}:{}".format("127.0.0.1",8889))
server.serve_forever()
from app import app
上面这行代码导入app.py
from kanado import Kanado
app = Kanado(__name__)
app = Kanado(name)创建了一个Kanado类型的对象app, server = WSGIServer("127.0.0.1", 8889, app) 把app对象传入到WSGIServer
class WSGIServer(object):
def __init__(self,host,port,application):
self.app = application
self.selector = selectors.DefaultSelector()
……
WSGIServer的write方法调用self.app(self.req.getenv(), self.start_response)
def write(self, sock, mask):
print('write')
sel = self.selector
body = self.app(self.req.getenv(), self.start_response)
self.app(self.req.getenv(), self.start_response)会触发app对象的call
def __call__(self,*args,**kwargs):
environ,start_response = args
url = environ['PATH_INFO']
app = self.uri_map.get(url,self.uri_map['default'])
return app(environ,start_response)
call中首先根据webserver传过来的environ字典,获得客户端请求的url,然后查找对象内部的uri_map字典,看是否有对应的处理函数,如果没找到,就使用默认的处理函数。
运行服务器,无论输入任何网址,都返回