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分发封装的主要内容,如果未能解决你的问题,请参考以下文章

Django 路由分发

Django分发控制器urls--白话聊Django系列

Django-URL路由分发include

Django(十四)课程机构列表页数据展示,Django的modelform,关于urls的重新分发

Django 笔记 URL 分发原理

django-url的分发