• stark组件之路由分发【模仿Django的admin】


    一、先看下django的admin是如何进行路由分发的

    1、先看下django的admin的url路径有哪些

    其实很简单,假如有一个书籍表,那么每张表对应四个url,增、删、改、查

    查看的url

    http://127.0.0.1:8080/admin/app1/auther/

    编辑的url

    http://127.0.0.1:8080/admin/app1/auther/23/change/

    增加的url

    http://127.0.0.1:8080/admin/app1/auther/add/

    删除的url

    http://127.0.0.1:8080/admin/app1/auther/23/delete/

    2、再看下django是如何实现路由分发的

    django就通过一条url就为每张表实现了四个url

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^stark/', stark.site.urls),
        url(r'^test_index/', views.test_index),
        url(r'^test_add/', views.test_add),
    ]  

    首先,路由分发除了有一级路由和二级路由的分发,还有第三种方式,第三种方式就是django的admin采用的分发的方式

    url(r'^cui/', (
        [url(r'^test1/', test.test1),
         url(r'^test2/', test.test2),
         url(r'^test3/', test.test3),
         ]
        ,None,None)),
    

      

    上面这一条代码就实现3条url

    cui/test1--------test.test1

    cui/test2--------test.test2

    cui/test3--------test.test3

    当然我们还可以继续在做三级分发

    url(r'^cui/', (
        [url(r'^test1/', ([url(r'^add/',test.test1),url(r'^edit/',test.test1),url(r'^del/',test.test1)],None,None]),
         url(r'^test2/', test.test2),
         url(r'^test3/', test.test3),
         ]
        ,None,None)),
    

      

    我们看下django的url的源码

    这里用了@propery装饰urls这个方法,这个装饰器将方法变为一个属性

        @property
        def urls(self):
            return self.get_urls(), 'admin', self.name
    

      

    由于我们将urls方法用@propery装饰器进行装饰,所以调用urls方法直接可以使用属性的方式调用,而不用使用括号的方式

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^stark/', stark.site.urls),
        url(r'^test_index/', views.test_index),
        url(r'^test_add/', views.test_add),
    ]
    

      

     下面我们还得看下get_urls这个方法,通过app的名称和表的名称的进行url的拼接,然后在使用include进行二级分发

    二、下面看下我们的stark组件是如何做路由分发的

    from django.conf.urls import url
    from django.contrib import admin
    from stark.services import stark
    from app1 import views
    print(stark.site.urls)
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^stark/', stark.site.urls),
        url(r'^test_index/', views.test_index),
        url(r'^test_add/', views.test_add),
    ]
    

      

    然后我们看下stark.site.urls这个方法,这个方法我们模仿django的admin同样也对这个方法用@property进行装饰

        @property
        def urls(self):
            return self.get_urls(),None,None
    

      

    这里函数这样返回,返回的值其实就是一个列表

    下面在看下get_urls方法

        def get_urls(self):
            temp = []
    
            for model,stark_class in self._register.items():
    
                temp_url = url(r"^{app}/{model}/".format(app = model._meta.app_label,model = model._meta.model_name),[stark_class.get_urls2,None,None])
    
                # url = [temp_url,(self.get_urls2(),None,None)]
    
                temp.append(temp_url)
            return temp
    

      

    这里只是把“app的名称/表的名称”的路径拼接出来,下面还有增删改查4个url需要拼接,在Starksite这个类中写的所有表都一样的逻辑,我们新建了一个类Starkclass,这个类中写每张表的特有的逻辑

    这4个url我们写在另外一个类中

     下面在stark_class这个对象中get_urls2这个方法

        @property
        def get_urls2(self):
            temp = []
            list_url = url(r'^$',self.list_url)
            add_url = url(r'^add/$',self.add_url)
            del_url = url(r'del/(?P<did>d+)/$',self.del_url)
            edit_url = url(r'edit/(?P<eid>d+)/$',self.edit_url)
    
            temp.append(list_url)
            temp.append(add_url)
            temp.append(del_url)
            temp.append(edit_url)
    
            return temp
    

      

    至此,我们的url就拼接完成

    Sstarkclass这个类主要是处理每张表自己的逻辑

    Starksite这个类是我们单例对象

    showlist这个类是我们处理查看相关的逻辑,因为查看的逻辑最复杂,所以单独拿出来写了一个类

    page是我们分页的组件

  • 相关阅读:
    SpringBoot第五篇:整合Mybatis
    SpringBoot第四篇:整合JDBCTemplate
    SpringBoot第三篇:配置文件详解二
    分享一篇去年的项目总结
    Oracle生成多表触发器sql
    Oracle 设置用户密码永不过期
    Oracle建表提示SQL 错误: ORA-00904: : 标识符无效
    MySql数据备份
    ETL全量多表同步简述
    ETL全量单表同步简述
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/10134954.html
Copyright © 2020-2023  润新知