• 注册路由的简易实现


    首先是因为今天很早就醒了,而且还睡不着,我就只好起床了,然后无聊就看了一下以前刚学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__属性的函数进行注册。

    基本就是上述这些步骤了,其实中间还有很多对于参数的处理和条件的判断,在简易实现这里就不做多的扩展了,更多的还是提供给自己一个简单的思路。

  • 相关阅读:
    mysql中delimiter
    error: unpacking of archive failed on file /usr/sbin/zabbix_agent;592e5bc3: cpio: open
    CefSharp中文帮助文档
    ASP.NET Aries 开发框架
    简洁的富文本编辑器
    asp.net core 获取appsettings.json里的配置
    在asp.net core中使用NLog
    临时禁用Resharper
    visual studio 无添加视图 选项
    visual studio(vs)初始化
  • 原文地址:https://www.cnblogs.com/zzy0306/p/10681242.html
Copyright © 2020-2023  润新知