10-实现仿flask框架kanado之默认页面

新建一个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 代码执行流程

  1. 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字典,看是否有对应的处理函数,如果没找到,就使用默认的处理函数。

运行服务器,无论输入任何网址,都返回

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 参考文档:https://blog.csdn.net/sinat_36651044/article/details...
    凤非飞阅读 13,776评论 0 0
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 8,124评论 0 9
  • 高阶函数:将函数作为参数 sortted()它还可以接收一个key函数来实现自定义的排序,reversec参数可反...
    royal_47a2阅读 3,982评论 0 0
  • flask源码分析 1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析...
    甘尼克斯_阅读 7,717评论 1 0
  • “呲~” 太治拧开汽水瓶,喝一大口,又举起来欣赏起橙色的透明液体: “妈妈,这就是夏天的味道吧?” “嗯?夏天的味...
    eileen_Y阅读 2,383评论 0 1