註冊路由的簡易實現

首先是由於今天很早就醒了,並且還睡不着,我就只好起牀了,而後無聊就看了一下之前剛學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

基本就是上述這些步驟了,其實中間還有不少對於參數的處理和條件的判斷,在簡易實現這裏就不作多的擴展了,更多的仍是提供給本身一個簡單的思路。函數

相關文章
相關標籤/搜索