首先是因为今天很早就醒了,而且还睡不着,我就只好起床了,然后无聊就看了一下以前刚学python时候跟着写的代码,现在理解的更全面点然后也正好总结一下其中的一些点,比如说注册路由。
注册路由
代码
resigter_handlers.py
# -*- coding: utf-8 -*-
import functools
def get(path):
def _get(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
wrapper.__method__ = "GET"
wrapper.__route__ = path
return wrapper
return _get
class App(object):
def register(self, method, path, handler):
if self.__class__:
pass
print(f"method: {method}
"
f"path: {path}
"
f"handler: {handler}"
)
app = App()
def add_routes(module_name):
dot = module_name.rfind(".")
if dot == -1:
mod = __import__(module_name, globals(), locals())
else:
name = module_name[dot+1:]
mod = __import__(name, globals(), locals())
for item in dir(mod):
if item.startswith("_"):
continue
func = getattr(mod, item)
if callable(func):
path = getattr(func, "__route__", None)
method = getattr(func, "__method__", None)
if path and method:
add_route(method, path, func)
def add_route(method, path, func):
app.register(method, path, RequestHandlers(func))
class RequestHandlers(object):
def __init__(self, func):
self.func = func
def __call__(self, request):
kwargs = request.match_info.items()
response = self.func(**kwargs)
return response
if __name__ == "__main__":
add_routes("handlers")
handlers.py
# -*- coding: utf-8 -*-
from _http.src.request_handlers.register_handlers import get
@get("/api/register")
def create_user():
return "create"
@get("api/user")
def get_user():
return "get"
@get("/api/update")
def update_user():
return "update"
@get("/api/delete")
def delete_user():
return "delete"
思路
首先是创建了一个add_route
的方法,用于在app对象中注册路由,其中的ReqestHandlers类是用来对web请求的参数进行解析的然后传递给视图函数处理的,这里就简单写了一下;
然后是实现了一个装饰器,用来指定__method__和__route__的,便于后面的func的筛选以及app中视图的注册;
接着就是编写add_routes函数,先通过文件名将该文件下所所有变量都导入到mod变量当中,然后便利mod变量中的所有属性,通过一个简单的筛选条件,将可调用并且具备__method__和__route__属性的函数进行注册。
基本就是上述这些步骤了,其实中间还有很多对于参数的处理和条件的判断,在简易实现这里就不做多的扩展了,更多的还是提供给自己一个简单的思路。