mini框架加路由
框架的回顾
URL-统一资源定位符 www.baidu.a/b/c.html
application函数的作用 解耦 框架的入口
字典-客户端解析出的资源路径
函数引用-传递回header内容
路由器回顾
数据发给路由器,路由器转发给其他网络,实现连接不同网络
请求数据发给框架,框架根据请求类型调用不同的处理函数
框架添加路由
添加路由的用途:根据请求不同,自动调用不同的功能
->功能选择处利用字典实现(手动添加字典)
->加装饰器(自动添加字典)
- 将键(可能的请求路径)值(函数引用)放入字典
- 自动添加字典-利用装饰器装饰时已经执行来先定义字典,但未执行装饰器
- 调用字典内的函数引用,即利用映射,只利用了装饰器先执行,并没有调用装饰器->调用的是添加进字典的原函数引用,是字典内的函数引用,未调用装饰器装饰后的函数引用,(写全只是为了写通用装饰器)
->流程:
- 利用带参数的装饰器添加字典的键值
- 接收服务器的请求
- 匹配请求与字典的键
- 执行值()
import re
URL_FUNC_DICT = dict()
def route(url):
def set_func(func):
# URL_FUNC_DICT["/index.py"] = index
URL_FUNC_DICT[url] = func # 向URL_FUNC_DICT字典中添加值
def call_func(*args, **kwargs): # call_func 并未执行
return func(*args, **kwargs)
return call_func
return set_func
@route("/index.html")
def index():
with open("./templates/index.html") as f:
content = f.read()
my_stock_info = "这是你的本月名称....."
content = re.sub(r"\{%content%\}", my_stock_info, content)
return content
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])
file_name = env['PATH_INFO']
# file_name = "/index.py"
try:
# func = URL_FUNC_DICT[file_name]
# return func()
return URL_FUNC_DICT[file_name]() # 取出字典中的值,是添加进字典前原函数的引用
except Exception as ret:
return "产生了异常:%s" % str(ret) # 若file_name没传值,为空,则会报错