首先是由於今天很早就醒了,並且還睡不着,我就只好起牀了,而後無聊就看了一下之前剛學python時候跟着寫的代碼,如今理解的更全面點而後也正好總結一下其中的一些點,好比說註冊路由。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}\n" f"path: {path}\n" 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請求的參數進行解析的而後傳遞給視圖函數處理的,這裏就簡單寫了一下;web
而後是實現了一個裝飾器,用來指定__method__和__route__的,便於後面的func的篩選以及app中視圖的註冊;api
接着就是編寫add_routes函數,先經過文件名將該文件下所全部變量都導入到mod變量當中,而後便利mod變量中的全部屬性,經過一個簡單的篩選條件,將可調用而且具有__method__和__route__屬性的函數進行註冊。app
基本就是上述這些步驟了,其實中間還有不少對於參數的處理和條件的判斷,在簡易實現這裏就不作多的擴展了,更多的仍是提供給本身一個簡單的思路。函數