路由层

路由匹配

path是精确匹配,re_path是正则匹配

取消自动加斜杠

APPEND_SLASH = False

django 路由匹配的时候其实可以匹配两次,第一次如果url后面没有加斜杠,django会让浏览器加斜杠再发送一次请求

无名分组

就是将括号内正则表达式匹配到的内容当做位置参数传递给视图函数

re_path('test/(\d+)/', views.test),

def test(request,x):
    print(x)
    return HttpResponse('test')

有名分组

可以给正则表达式起一个别名

就是将括号内正则表达式匹配到的内容当做关键字参数传递给视图函数

re_path('testadd/(?P<year>\d+)', views.testadd) #year这个名字是自己起的

def testadd(request,year):
    print(year)
    return HttpResponse('testadd')

无名分组和有名分组不能混合使用

但是同一种分组内可以使用多次

re_path('test/(\d+)/(\d+)/(\d+)', views.test)

def test(request,*args):
    print(args)
    return HttpResponse('test')

'''
('123', '456', '789')
'''
re_path('testadd/(?P<year>\d+)/(?P<month>\d+)/(?P<day>\d+)', views.testadd),

def testadd(request,**kwargs):
    print(kwargs)
    return HttpResponse('testadd')
    
'''
{'year': '123', 'month': '456', 'day': '789'}
'''

反向解析

通过一些方法得到一个结果,该结果可以访问对应的URL,触发视图函数

#urls.py中,给路由和视图函数起一个别名:book
re_path('func_xxx/', views.func,name='book'),
re_path('home/', views.home),

#后端反向解析
from django.shortcuts import render,HttpResponse,reverse

def home(request):
    res=reverse('book')
    # 视图函数中可能要用到res
    print(res)
    return render(request,'home.html')

'''
/func_xxx/
'''

#前端反向解析
在前端页面要用到这个'/func_xxx/' url的地方用以下代码代替,以后不管这个url怎么变化,以下代码都不用变化,通过反向解析,就可以对应到urls.py中的那个url
{% url 'book' %}

无名有名分组反向解析

前端格式:{% url 别名 参数1 参数2... %}

后端格式:reverse('别名',args=(参数1,参数2...))

无名
#路由
re_path('func/(\d+)/', views.func,name='book')
#前端
#123这个数字是自己传入的,要能够被 \d+ 匹配
<a href="{% url 'book' 123 %}">1</a>

from django.shortcuts import render,HttpResponse,reverse
#后端,args=(123,)的值是元祖,123这个数字是自己传入的,要能够被 \d+ 匹配
reverse('book',args=(123,))


def func(request,args):
    return HttpResponse('func')

有名
#路由
re_path('funct/(?P<xxx>\d+)/', views.funct,name='aaa'),

#前端两种方式
#方式一
<a href="{% url 'aaa' 123 %}">2</a>
#方式二
<a href="{% url 'aaa' xxx=123 %}">3</a>

from django.shortcuts import render,HttpResponse,reverse
#后端两种方式
#方式一
reverse('aaa',args=(123,))
#方式二
reverse('aaa',kwargs={'xxx':123})


def funct(request,xxx):
    return HttpResponse('funct')

路由分发

django的每一个应用都可以有自己的templates文件夹,urls.py文件,static文件夹

分组开发,每个人开发自己的应用

当路由匹配特别多的时候,总路由不再直接做匹配和触发视图函数的事情,而是仅仅只做分发操作

#总路由
from django.contrib import admin
from django.urls import path,re_path,include
from app01 import views

#方式一
# from app01 import urls as app01_urls
# from app02 import urls as app02_urls

urlpatterns = [
    path('admin/', admin.site.urls),
    #方式一
    # re_path('app01/',include(app01_urls)),
    # re_path('app02/',include(app02_urls))
    
    #方式二,推荐
    re_path('app01/',include('app01.urls')),
    re_path('app02/',include('app02.urls'))

]

#子路由
#app01  urls.py
from django.urls import path,re_path
from app01 import views
urlpatterns = [
    re_path('reg/', views.reg)
]

#app02  urls.py
from django.urls import path,re_path
from app02 import views
urlpatterns = [
    re_path('reg/',views.reg)
]

名称空间(了解)

多个应用出现了相同的别名,正常情况下,反向解析不能自动识别前缀


#其实只要在各个应用的别名前面加上app名称这个前缀,这样别名就不一样了,

urlpatterns = [
    re_path('reg/', views.reg,name='app01_reg')
]

urlpatterns = [
    re_path('reg/',views.reg,name='app02_reg')
]