• stark组件开发之URL分发和默认Handler


    register 函数添加一个,prev参数,默认None ,用于可以让用户自己指定前缀。

        def register(self, model_class, handler_class=None, prev=None):
    
            if handler_class is None:
                handler_class = StartHandler  # 做个默认的Handler
    
            self._registry.append({'model_class': model_class, "handler": handler_class(model_class), "prev": prev})
            '''
            [
                {'model_class':models.Depart, "handler":DepartHandler(models.Depart),"prev": prev},
                {'model_class':models.UserInfo, "handler":UserInfoHandler(models.UserInfo),"prev": prev},
                {'model_class':models.Host, "handler":HostHandler(models.Host),"prev": prev},
            ]

    拼接时,判断 prev 的值。 不为空的, 就需要拼接上前缀:

        def get_urls(self):
            partterns = []
            for item in self._registry:
                model_class = item["model_class"]
                handler = item["handler"]
                prev = item["prev"]
                # 获取当前model_class所在的app名字 # 获取当前model_class的类名,小写
                app_label, model_name = model_class._meta.app_label, model_class._meta.model_name
    
                if prev:
                    partterns.append(re_path(r"%s/%s/%s/list/$" % (app_label, model_name, prev), handler.check_list_view))
                    partterns.append(re_path(r"%s/%s/%s/add/$" % (app_label, model_name, prev), handler.add_view))
                    partterns.append(re_path(r"%s/%s/%s/change/(d+)/$" % (app_label, model_name, prev), handler.change_view))
                    partterns.append(re_path(r"%s/%s/%s/del/$(d+)/$" % (app_label, model_name, prev), handler.delete_view))
                else:
                    partterns.append(re_path(r"%s/%s/list/$" % (app_label, model_name), handler.check_list_view))
                    partterns.append(re_path(r"%s/%s/add/$" % (app_label, model_name), handler.add_view))
                    partterns.append(re_path(r"%s/%s/change/(d+)/$" % (app_label, model_name), handler.change_view))
                    partterns.append(re_path(r"%s/%s/del/$(d+)/$" % (app_label, model_name), handler.delete_view))
            return partterns
    def get_urls(self):

    到这里还有一个,需要处理的就是。 一直都是默认直接,拼接的是一个,视图函数。  如果我想要一个 路由分发的 url呢?
    而且我这里默认生成的是,4个URL。 如果只想要2个,或者三个呢? 这种逻辑,就不能用了!所以需要改变一下:

    思路就是,利用类 查找变量的方式来做这件事情!
    先将 register  的, 函数修改一下!

    def register(self, model_class, handler_class=None, prev=None):
        if handler_class is None:
            handler_class = StartHandler  # 做个默认的Handler
    
        self._registry.append({'model_class': model_class, "handler": handler_class(model_class), "prev": prev})
        '''
        [
            {'model_class':models.Depart, "handler":DepartHandler(models.Depart),"prev": prev},
            {'model_class':models.UserInfo, "handler":UserInfoHandler(models.UserInfo),"prev": prev},
            {'model_class':models.Host, "handler":HostHandler(models.Host),"prev": prev},
        ]
        '''
    
    
    def get_urls(self):
        partterns = []
        for item in self._registry:
            model_class = item["model_class"]
            handler = item["handler"]
            prev = item["prev"]
            # 获取当前model_class所在的app名字 # 获取当前model_class的类名,小写
            app_label, model_name = model_class._meta.app_label, model_class._meta.model_name
            if prev:
                partterns.append(re_path(r"%s/%s/%s/" % (app_label, model_name, prev), (handler.get_urls(), None, None)))
            else:
                partterns.append(re_path(r"%s/%s/" % (app_label, model_name), (handler.get_urls(), None, None)))
        return partterns

    原来放  视图函数的位置。 不再放视图函数。 而是又做了一次的, 路由分发。

    这样, 依然能达到。 我们初始的效果。 为每张表, 定义了4个 URL。  增删改查。

    如果用户不想使用默认的。 这就好办了!  只需要在自己的类里面, 定义一个 get_urls() 的方法。 就可以了!
    因为,类的实例化对象, 在查找变量的时候。 会先从自己这里找, 如果没有 去自己的类中找。 如果再没有才会去父类找。
    这样,只要用户 自己定义了  get_urls()  那么, 就会使用。 自己的这个方法! 而不会使用 基类的。

    handler 是每张表自己的类。  我在基类StarkHandler中 定义, 视图的功能:

    class StarkHandler(object):
    
        def get_urls(self):
            partterns = [
                re_path(r"list/$", self.check_list_view),
                re_path(r"add/$", self.add_view),
                re_path(r"change/(d+)/$", self.change_view),
                re_path(r"del/$(d+)/$", self.delete_view),
            ]
            partterns.extend(self.extra_url())  # 这个函数如果在子类中出现。 根据查找的原则。 会先去子类中查找。
            return partterns
        
        def extra_url(self):
            return []

    比如一个子类中这样写:(ps 此种情况只适合, 在原有基础上增加URl)

    class DepartHandler(StartHandler):
        '''在原有的URL基础上,再增加一个URL'''
        def extra_url(self):
            return [
                re_path("detail/(d+)/$",self.detail_view)
            ]
        
        def detail_view(self):
            return HttpResponse("详情页")

    比如一个子类中这样写:(ps  相要自己的url, 不想使用默认的)

    class DepartHandler(StartHandler):
        '''想要几个URL 就 重写get_urls()'''
        def get_urls(self):
            return [
                re_path("detail/(d+)/$",self.detail_view),
    re_path("list/$",self.check_list_view),
    ]

    def detail_view(self):
    return HttpResponse("详情页")

    这样, 就可以在运行的时候,执行自己的 get_urls() 方法。  就只会产生两条,URL。

    这里用到的知识点: 类的实例化对象,在找变量的时候。  永远都是先从自身找, 然后是自身的类中找。最后才会去父类寻找。

  • 相关阅读:
    JavaScript函数中的this四种绑定形式
    jQuery的html()、text()和val()的使用和区别
    iframe-父子-兄弟页面相互传值(jq和js两种方法)
    Spring Boot 嵌入式 Tomcat 文件上传、url 映射虚拟路径
    SpringMVC上传图片
    <iframe>和<frame>标签属性详解
    Mybatis 事物回滚最简单的操作方式
    SpringBoot配置log4j
    springboot整合redis(集群)
    Maven setting.xml简易配置
  • 原文地址:https://www.cnblogs.com/chengege/p/10735214.html
Copyright © 2020-2023  润新知