为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。

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

stark组件开发之URL分发和默认Handler的更多相关文章

  1. stark组件开发之URL别名的设置

    from django.urls import re_path from stark.servers.start_v1 import site, StartHandler from django.ht ...

  2. iOS开发之Xcode 6更新默认不支持armv7s架构

    最近一次的Xcode 6更新默认不再支持arm7s架构,究竟是要废除不用呢还是仅仅只是一个疏忽? 目前的Xcode 6配置里定义${ARCHS_STANDARD}为armv7, arm64,当然这个定 ...

  3. dt二次开发之-url伪静态的自定义

    dt内核的方便性在于代码内核完全开源,都可以根据自身需要进行优化整改,个人在这段时间的深入研究,发现这套内核的方便性,今天继续给大家分享下DT的url伪静态如何自定义函数. url自定义文件是在api ...

  4. python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)

    一.内容回顾 类可否作为字典的key 初级 举例: class Foo(object): pass _registry = { Foo:123 } print(_registry) 执行输出: {&l ...

  5. stark组件(2):提取公共视图函数、URL分发和设置别名

    效果图: Handler类里处理的增删改查.路由分发.给URL设置别名等包括以后还要添加的很多功能,每一个数据库的类都需要,所以我们要把Handler提取成一个基类.提取成基类后,每一个数据表都可以继 ...

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

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

  7. stark组件配置,二层URL

    1.django的admin配置 2 stark组件开发 3.2层url分发 4.小结 1.django的admin配置 model.py from django.db import models # ...

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

    一.先看下django的admin是如何进行路由分发的 1.先看下django的admin的url路径有哪些 其实很简单,假如有一个书籍表,那么每张表对应四个url,增.删.改.查 查看的url ht ...

  9. Android开发之旅5:应用程序基础及组件

    引言 上篇Android开发之旅:应用程序基础及组件介绍了应用程序的基础知识及Android的四个组件,本篇将介绍如何激活组关闭组件等.本文的主题如下: 1.激活组件:意图(Intents) 1.1. ...

随机推荐

  1. Extjs4 上传图片并进行图片格式以及大小验证

    在做项目是遇到上传图片,并在前端限制图片上传的大小,下面就直接贴出主要的上传图片的代码,以及图片大小的验证,但前端没有验证图片的宽高验证 一.先创建出上传图片的组件,使用filefield组件 var ...

  2. [ 转载 ] ssh连接远程主机执行脚本的环境变量问题

    近日在使用ssh命令ssh user@remote ~/myscript.sh登陆到远程机器remote上执行脚本时,遇到一个奇怪的问题: ~/myscript.sh: line n: app: co ...

  3. 使用xshell xftp连接centos的过程。

    1 配置网络 登录Centtos系统,配置网卡. cd 空格/etc/sysconfig/network-scripts  回车键. ls 查看文件 vi ifcig-eth0  编辑这个文件 修改为 ...

  4. [cocos2d-x]认识游戏开发(图)

    FreeMind的.mm文件下载: http://yunpan.cn/cfL3cm6CZkMSt (提取码:e01a)

  5. 15.Colection集合和Iterator接口.md

    目录 1.Collection 1.1概念 1.1遍历方法-Lambda表达式 1.2遍历方法-Iterator接口 1.3使用Lambda方法遍历Iterator接口 1.4使用Foreach方法遍 ...

  6. Celery + RabbitMq 示意图

    一直搞不清楚消息队列和任务队列是如何结合的,直到碰到了 :http://www.cnblogs.com/jijizhazha/p/8086119.html 中的图,恍然大悟,凭借自己的理解,画了这幅组 ...

  7. UITableView性能的优化()

    1.0 使用不透明视图 不透明的视图可以极大地提高渲染的速度. 2.0 不要重复创建不必要的cell 也就是我们常说的 循环利用机制 (建立缓冲池) 3.0  减少视图的数目 4.0  不要做多余的绘 ...

  8. C# 反射获取所有视图

    原地址:忘了 controller 的 action 加上属性 [System.ComponentModel.Description("菜单列表")]  且  返回值为 Syste ...

  9. CAP与Base理论

    分布一致性的提出 在分布式系统中要解决的一个重要问题就是数据的复制.在我们的日常开发经验中,相信很多开发人员都遇到过这样的问题:假设客户端C1将系统中的一个值K由V1更新为V2,但客户端C2无法立即读 ...

  10. javascript中scrollTop和offsetTop的区别

    scrollTop是指某个可滚动区块向下滚动的距离,offsetTop则是元素的上边框与父元素的上边框的绝对距离. 1.offsetTop   : 当前对象到其上级层顶部的距离. 不能对其进行赋值.设 ...