一.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版本使用的是urlTemplates:
{{ 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}) #进行模板渲染,返回指定的html2.关键参数
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))