Django之URL路由系统(关系映射,name值,路由分发,默认值,命名空间namespace)【三】

一.URL路由映射关系

实战Django的URL路由映射关系:https://blog.csdn.net/Burgess_zheng/article/details/86528727

1.(静态url)一个url对应一个执行函数,或者执行类

FBV:  

path('burgess_web/', views.func),#最新版本的Django路由使用path

url(r'^burgess_web/', views.func), #2.0版本使用的是url

#匹配该url执行对应的函数 views下的func函数

CBV: 

path('burgess_web/', views.Class.as_view()), #最新版本的Django路由使用path

url(r'^burgess_web/', views.Class.as_view()), #2.0版本使用的是url

#匹配该url执行对应views下的自定义类Class(该类继承djangon的类)

2.(动态url)一类的url对应一个执行函数

FBV: 

  #动态url
       #1.位置形参
            re_path('burgess01-(\d+)-(\d+).html/', views.test01),  #最新版本的Django路由使用path
            #url(r'^burgess01-(\d+)-(\d+).html/', views.test01),     #2.0版本使用的是url
      #2.关键形参
           re_path('burgess02-(?P<nid>\d+)-(?P<uid>\d+).html/', views.test02),   #最新版本的Django路由使用path
           #url(r'^burgess02-(?P<nid>\d+)-(?P<uid>\d+).html/', views.test02),      #2.0版本使用的是url
      #关键形参数量对应接收
          re_path('burgess03-(?P<nid>\d+)-(?P<uid>\d+).html/', views.test03),    #最新版本的Django路由使用path
           # url(r'^burgess03-(?P<nid>\d+)-(?

动态url对应处理函数的3种接收方式

def test01(request,*args):
    print(args)
    return HttpResponse('args:%s'%json.dumps(args))

def test02(request,*args,**kwargs):
    print(kwargs)
    return HttpResponse('kwargs:%s'%json.dumps(kwargs))

def test03(request,nid,uid):
    print(nid,uid)
    return HttpResponse('nid:%s,uid:%s' %(uid,nid))
 

CBV: 和FBV一样的就是把处理函数改成处理的类而已

 

二.url路由的name值

实战Django的URL路由name值:https://blog.csdn.net/Burgess_zheng/article/details/86529185

name的出现是为了什么?就是为了构架自己想要的url

1.html(模板)通过name获取url并且可以进行修改 (两种方式)

1.{% url 'indexx' 2 6 %}
    URL:  

         re_path('burgess01-(\d+)-(\d+).html/', views.test01,name='burgess01'),#最新版本的Django路由使用path
         #url(r'^burgess01-(\d+)-(\d+).html/', views.test01,name='burgess01'),   #2.0版本使用的是url
 

    Templates:

        {% url 'burgess01' 2 6 %}    #修改用户访问的url的动态参数
        burgess01 == burgess01-(\d+)-(\d+).html  #用户访问的真实url
        'burgess01' 2 6 == burgess01-2-6.html
        #如果用户访问的url:burgess01-13-16.html
        #该url对应函数进行render
        #render的html使用{% url 'burgess01' 2 6 %} == burgess01-2-16.html

    
2.{{ request.path_info }}    
    URL:  

        re_path('burgess01-(\d+)-(\d+).html/', views.test01,name='burgess01'),  #最新版本的Django路由使用path
        #url(r'^burgess01-(\d+)-(\d+).html/', views.test01,name='burgess01'),      #2.0版本使用的是url

    Templates:

        {{ request.path_info }}      #获取用户访问的真实url
        request.path_info ==burgess01-(\d+)-(\d+).html  #用户访问的真实url
        #如果用户访问的url:burgess01-1-2.html
        #该url对应函数进行render
        #render的html使用{ request.path_info }} == burgess01-1-2.html

2.func函数通过name获取url并且可以进行修改(两种方式)

1.位置参数
URL:  
    re_path('burgess01-(\d+)-(\d+).html/', views.test01,name='burgess01'),  #最新版本的Django路由使用path
    #url(r'^burgess01-(\d+)-(\d+).html/', views.test01,name='burgess01')      #2.0版本使用的是url
     
FUNC: 
    def test01(request,*args):
        from django.urls import reverse       #修改用户访问的url动态参数
        names = reverse('burgess01', args={90,88,}) #修改用户的url的动态参数
        print(names)
        return render(request,'burgess.html',{'names':names})  #进行模板渲染,返回指定的html

2.关键参数
URL: 
        re_path('burgess02-(?P<nid>\d+)-(?P<uid>\d+).html/', views.test02,name='burgess02'),  
        #url(r'^burgess02-(?P<nid>\d+)-(?P<uid>\d+).html/', views.test02,name='burgess02'), 
FUNC: 
    def index(request,nid,uid):
        from django.urls import reverse
        names = reverse('burgess02',kwargs={"nid":80,"uid":90})
        print(names)
       return render(request,'burgess.html',{'names':names})  #进行模板渲染,返回指定的html

三.URL路由分发

实战Django的URL路由分发:https://blog.csdn.net/Burgess_zheng/article/details/86529768

多个app的时候我们使用路由分发,因为如果把所有的app写在统一个urls.py里面会导致复杂不说,以后分工就有点麻烦。
如:一个做运维自动化平台的,Monitor(监控)的团队,一个做cmdb的团队,然后2个团队修改同个urls.py完全没必要.,这样后期修改就不会乱了也无需修改对方团队的东西(互不影响)
应用场景:构架你自己的运维平台的话,有资产管理啊,Monitor啊,openstyle..等之类

project(urls.py):

from django.contrib import admin
from django.urls import path,re_path    #Django版本2.0以上
from django.conf.urls import url            #Django2.0
from django.conf.urls import include


urlpatterns = [
    path('admin/', admin.site.urls),

    #路由分发
        #cmdb_app
    re_path('cmdb/',include("cmdb.urls")),
    #url(r'^cmdb/', include("cmdb.urls")),
        #monitor_app
    re_path('monitor/', include("monitor.urls")),
    # url(r'^monitor/', include("monitor.urls")),
]

app(urls.py):

from django.urls import path,re_path #Django版本2.0以上
from app_name import views
from django.conf.urls import url          #Django2.0
from django.conf.urls import include

urlpatterns = [
    re_path('',views.burgess_func),
    #url(r'',views.burgess_func),
]

四.默认值

就是在url自定义一个关键实参,用户访问的时候,url对应的函数也需要写个关键形参接收

#URL定义默认值

from django.contrib import admin
from django.urls import path,re_path #Django版本2.0以上
from project_burgess import views
from django.conf.urls import url  #Django2.0

urlpatterns = [
    path('admin/', admin.site.urls)
    re_path('xxx/', views.func,{'name':'root'}),   #{'name':'root'}:默认值==关键形参
    #url(r'^xxx/', views.func,{'name':'root'}),    #{'name':'root'}:默认值==关键形参

]

#URL对应函数接收默认值

from django.shortcuts import render,HttpResponse,redirect
def func(requst,name):  #name形参:接收来自url的默认值
    return  HttpResponse('name')

五.命名空间namespace

实战Django的URL的命名空间:https://blog.csdn.net/Burgess_zheng/article/details/86530913

简单理解是用户访问的两个不同的父URL指向相同的子URL

#定义父URL

from django.contrib import admin
from django.urls import path,re_path #Django版本2.0以上
from project_burgess import views
from django.conf.urls import url  #Django2.0
from django.conf.urls import include

urlpatterns = [
    path('admin/', admin.site.urls)
    #命名空间namespace
    re_path('a/',include("namespace.urls", namespace='author')),
    #url(r'^a/', include("namespace.urls", namespace='author')),
    re_path('b/',include('namespace.urls', namespace='publisher')),
    #url(r'^b/', include('namespace.urls', namespace='publisher')),

]

#定义子URL(app下)

__author__ = "Burgess Zheng"
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from django.urls import path,re_path #Django版本2.0以上
from namespace import views
from django.conf.urls import url  #Django2.0

app_name='namespace'
urlpatterns = [
    re_path('index/',views.index,name='index'),
   #url(r'^index/', views.index,name='index'),

]

#URL对应函数使用命名空间+name值重生URL

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def index(request):
    from django.urls import reverse  # 根据URL name 进行生成 url
    a = reverse('author:index')  #根据前缀的url生成该前缀的整个父子url
    print(a)#打印结果 127..../a/index/
    b = reverse('publisher:index') #根据前缀的url生成该前缀的整个父子url
    print(b)#打印结果 127..../b/index/
    return HttpResponse('a:%s b:%s'%(a,b))

猜你喜欢

转载自blog.csdn.net/Burgess_zheng/article/details/86526905