一、先看下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是我们分页的组件

stark组件之路由分发【模仿Django的admin】的更多相关文章

  1. stark组件之批量操作【模仿Django的admin】

    一.先看下django的admin是如何实现批量操作 首先在配置类中定义一个函数 然后我们为这个函数对象设置一个属性,这个属性主要用来显示在select标签中显示的文本内容 最后把函数对象放到一个ac ...

  2. stark组件之搜索【模仿Django的admin】

    一.先看下django的admin是如何做搜索功能的 配置一个search_fields的列表就可以实现搜索的功能 class testbook(admin.ModelAdmin): # 第一步,定义 ...

  3. stark组件之启动【模仿Django的admin】

    首先需要在settings注册app INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib ...

  4. stark组件之注册【模仿Django的admin】

    一.先看下django的admin是如何实现注册功能 首先导入admin这个对象和我们的model模块 from django.contrib import admin # Register your ...

  5. stark组件之分页【模仿Django的admin】

    我们的stark组件用的我们的分页组件,没有重新写 下面直接看下分页的代码 class page_helper(): def __init__(self, count, current_page, p ...

  6. stark组件之pop操作【模仿Django的admin】

    一.先看下什么django的admin的pop到底是个什么东西 其实就是这么一个东西, a.在添加页面,在一对多和多对多的项后加了一个+号 b.点击这个加号,会弹出对应的添加 页面,在新的添加 c.添 ...

  7. stark组件之过滤操作【模仿Django的admin】

    一.先看下django的admin是如何实现过滤操作 首先在配置类中顶一个list_filter的列表,把要过滤的字段作为元素写i进去就可以了 class testbook(admin.ModelAd ...

  8. stark 组件 url 二级分发的实现

    模拟 admin 组件url设计思路 项目urls 文件中: from django.contrib import admin from django.urls import path from st ...

  9. crm项目之stark组件前戏(二)

    stark组件的设计主要来源于django中admin的功能,在django admin中只需要将模型表进行注册,就可以在页面对该表进行curd的动作,那么django admin是如何做的呢? 在d ...

随机推荐

  1. 八皇后问题C语言解法

    偶遇八皇后问题,随即自己写了一个仅供参考 #include<stdio.h> #include<math.h> #define SIZE 8 void Circumsribe( ...

  2. Linux:写一个简单的服务器

    开始了新篇章:Linux网络编程. 基础知识: 套接字概念 Socket本身有"插座"的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型.本质为内核借助缓冲区形成的伪 ...

  3. Eclipse SVN文件冲突及不能直接提交情况

    下图为Eclipse SVN使用过程中存在文件冲突的情形. 以下是三种冲突情形及相应解决办法: 1.简单的文件版本冲突 情形:A改变了文件的头部,B改变了文件的尾部,如果两者改动互不影响,SVN可以智 ...

  4. Linux安装卸载jdk1.8

    首先到官网下载  Linux x64 182.87 MB jdk-8u191-linux-x64.tar.gz https://www.oracle.com/technetwork/java/java ...

  5. PHP使用redis防止大并发下二次写入(如如何防止重复下订单)

    php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写. $lock_k ...

  6. 通过使用浏览器对象模型,输出当前浏览器窗口中打开的文档的URL信息,并将显示在窗口中。

    <script type="text/javascript">window.document.write("这个网页文件来自:".bold());w ...

  7. java中break和continue跳出指定循环(转载)

    java中break和continue跳出指定循环 java中break和continue可以跳出指定循环,break和continue之后不加任何循环名则默认跳出其所在的循环,在其后加指定循环名,则 ...

  8. 混合app开发,h5页面调用ios原生APP的接口

    混合APP开发中,前端开发H5页面,不免会把兼容性拉进来,在做页面的兼容性同事,会与原生app产生一些数据交互: 混合APP开发,安卓的兼容性倒是好说,安卓使用是chrome浏览器核心,已经很好兼容H ...

  9. JAVAWEB 一一 fmt标签 和日期插件

    fmt标签 效果 操作:  ①导入标签 <%@ taglib uri=httpjava.sun.comjspjstlfmt prefix=fmt %> ②标签这么写 <td>& ...

  10. git初使用总结感悟

    ####首先说说git在工作中的一般流程1.首先就是进入新公司之后,要了解公司用的是什么代码托管,比如gitlab或者github(私有库花钱) 2.找技术同时把你加入到工作项目组并给你权限(一般都是 ...