django的url分发封装
Posted abnerlc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django的url分发封装相关的知识,希望对你有一定的参考价值。
url的分发与封装
组件和应用App的区别,组件其不仅服务于当前项目,其还可以服务于其他项目,即可以重复使用,
路由分发的格式,路由器分发path()中第二个参数可以是视图方法,也可以是路由分发,传一个元祖,第一个数据是路径匹配用[]括起来路径,第二,第三个是None,path里面还可以嵌套,即可以分发若干路径
urlpatterns = [ path(‘admin/‘, admin.site.urls), re_path(‘ad/‘,([ path(‘test/‘,test), path(‘test2/‘,test), ],None,None)),
对url的分发进行封装
相关概念理解
第一首先得理解app注册的含义是什么
‘Xadmin.apps.XadminConfig‘,
其注册含义就是执行app应用下面app.py文件下面的方法,当django启动的时候就开始执行方法以及函数,此外还有一个函数
from django.utils.module_loading import autodiscover_modules
class XadminConfig(AppConfig): name = ‘Xadmin‘ def ready(self): autodiscover_modules(‘Xadmin‘) #在App里面一定会执行的函数,扫描当前项目所有app,并执行括号里面的py文件
因此当某个项目像用到组件功能时,就引入该组件即可,所以把想要执行或者加载模块,就放在组件中 ,即Xadmin中的apps文件下,注意注册顺序
第二步函数设定与self的理解,切记,self指的是调用该类的对象
路由分发
第三步路径是django启动的时候就已经生成了,只不过是没有放在url路径中,如
在A类中形成这样的路径 re_path(‘app01/blog‘,ModelXadmin(Blog,site).url) re_path(‘app01/article‘,ModelXadmin(Article,site).url) 然后在B类中再次计算路径分发 假如是ModelXadmin(Article,site).url调用url,那么在B类中的self指的就是此时实例化的对象,self.model=Aritcle===app01.models.Article,因此可以做相应的增删改查 re_path(‘app01/article‘,[ re_path(‘app01/article/delete/(\\d+)‘,self.test)..... re_path(‘app01/blog/delete/(\\d+)‘.self.test1)..... re_path(‘app02/A/delete/(\\d+)‘,self.test).... ],None,None) 此时的self指的就是传进来的表名对应 的实例化对象
路由分发步骤
第一步在组件app中声明django启动时,就执行Xadmin相关的方法和模块
from django.apps import AppConfig from django.utils.module_loading import autodiscover_modules class XadminConfig(AppConfig): name = ‘Xadmin‘ def ready(self): autodiscover_modules(‘XXadmin‘)
第二步在Xadmin中设计相关函数
#!/usr/bin/env python # -*- coding:utf-8 -*- from django.urls import path,re_path,include from django.shortcuts import HttpResponse,render class ModelXadmin(object): def __init__(self,model,site): self.model=model self.site=site def url(self): # self指调用他的对象,也就是site调用 url = [] url.append(re_path(‘^add/$‘,self.test)) url.append(re_path(‘^delete/(\\d+)‘,self.test)) url.append(re_path(‘^update/(\\d+)‘,self.test)) url.append(re_path(‘^check/(\\d+)‘,self.test)) url.append(re_path(‘^\\w+/$‘,self.test)) return url,None,None # [re_path(‘^delete/(\\d+)‘,test),],None,None def test(self, request, *args): print(self.model) data_list=self.model.objects.all() print(data_list) return render(request, "XXadmin/XXadmin_check.html","data_list":data_list) class XadminSite(object): def __init__(self): self._registry= def get_url(self): # 对所有的表生成相应的路径 这是url调用的,因此此时的self就和url中self是一样的 url = [] for model, wait_class in self._registry.items(): # Xadmin.site.register(Blog)--->self._registry[model]=admin_class(model,self) =blog:ModelXadmin(blog,site) app_name = model._meta.app_label table_name = model._meta.model_name url_base = re_path(‘^0/1/‘.format(app_name,table_name),wait_class.url()) # 假如是blog注册 re_path(‘app01/blog‘,ModelXadmin(Blog,site)) # 用配置类分发路径,这样我就可以拿到配置类内的所有方法,包括 re_path(‘app01/article‘,ModelXadmin(Article,site)) url.append(url_base) return url # [app01/article/,[re_path(‘^delete/(\\d+)‘,test),],None,None] @property # 相当于把结果封装成列表形式 def urls(self): return self.get_url(), None, None # [app01/article/,[re_path(‘^delete/(\\d+)‘,test),],None,None],None,None # 这个self是site调用这个方法,因此这个self指的是site,谁调用方法,方法里面的self就是该对象 def register(self,model,admin_class=None,**option): if not admin_class: admin_class=ModelXadmin self._registry[model]=admin_class(model,self) # z注意这里需要传值,即把需要的值放在init里面, model指的注册时传进来的表名 site=XadminSite() # Xadmin.site.urls # app01/article/add/1 # 那个对象调用方法 # 路径在django启动的时候就生成的,但是匹配却是一层一层往上找的 # 加入
第三步在url中调用方法,进行路径分发
path(‘Xadmin/‘, Xadmin.site.urls),
以上是关于django的url分发封装的主要内容,如果未能解决你的问题,请参考以下文章