django 03 django路由層
阿新 • • 發佈:2022-12-12
django請求生命週期流程圖
django路由層
# 1.路由匹配 django1.x 第一個引數是正則表示式 django2.x+ path第一個引數寫什麼就匹配什麼 """ -1.django所有版本都會在在匹配時有自己加斜槓字尾的功能 -2.使其不加斜槓匹配,在django的settings: APPEND_SLASH = False """ # 2.轉換器 當我們無法確定自己的網址字尾是否固定時,就可以使用轉換器 django2.x及以上動態匹配有五種轉換器""" str: 匹配除路徑分隔符外的任何非空的字元 int:匹配0或任意正整數 sulg:匹配任意一個由字母或數字組成的字元 uuid:匹配格式化後的uuid path:能夠匹配完整的url路徑 """ ps: django支援自定義轉換器(方便自己寫正則表示式匹配更加細化的內容) path('login_auth/', views.login), # views檢視傳參:login(request) path('register/<str:func>/',views.register_func), # views檢視傳參:register_func(request, func) path('register/<str:func>/p/<int:id>/', views.register_func) # views檢視傳參:register_func(request, func, id) """ # 1.使用轉換器會對檢視函式產生影響 # 2.轉換器匹配到的內容需要當作檢視函式的關鍵字引數傳入 # 3.轉換器有幾個,檢視函式的引數就必須有幾個""" # 3.正則匹配 """django2.x以上有re_path""" -1. re_path(正則表示式,函式名(檢視函式地址)) 一旦網址字尾的正則能夠匹配到內容就會自動執行後面的函式,然後結束整個路由的匹配 -2. re_path('^test/$', view.test) 當網址字尾不固定時可以使用轉換器來匹配 # 4.正則匹配的無名有名分組 無名分組: re_path('^test/(\d+)/', views.test) 正則表示式匹配到的內容會當作檢視函式的位置引數傳遞給檢視函式 有名分組: re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test) 正則表示式匹配到的內容會當做檢視函式的關鍵字引數傳遞給檢視函式 """無名分組與有名分組不能混合使用"""
反向解析
""" 頁面上提前寫死了許多路由,一旦路由發生變化會導致所有頁面相關的連結失效,針對此類問題需要使用反向解析 """ # 1.什麼是反向解析? 返回一個結果,該結果可以訪問到對應的路由 # 2.路由對應關係起別名 path('login_auth/', views.login, name='login') # 3.反向解析語法的使用 前端: {% url 'reg_view' %} 後端: 1.先匯入 from django.shortcuts import reverse 2.檢視函式內寫入 reverse('reg_view') """無名解析:在path,re_path,url中的操作是相同的""" # 4.動態路由的有名無名反向解析 - 路由層: path('register/<str:func>/p/<int:id>/', views.register_func, name='register_func') - 檢視層: def register_func(request,func,id): reverse('register_func',args=('123',1234,)) return render(request,'001.html') - 前端: <a href="{% url 'register_func' '123' 1234 %}"></a> - url輸入: http://XXX/register/123/p/1234/
路由分發
# 1.django中的應用都可以有自己獨立檔案 urls.py、templates資料夾、static資料夾 # 2.為什麼要路由分發? -1.為了能夠讓基於django開發的多個應用完全獨立,便於小組開發 -2.當專案特別大 應用特別多的時候 可以使用路由分發 # 3.總路由負責將指明道路,子路由負責操作資料 總路由: path('app01/', include('app01.urls')), path('app02/', include('app02.urls')), 子路由: path('after/', views.after) # app01 path('after/', views.after) # app02
django名稱空間
# 1.有路由分發場景下多個應用在涉及到反向解析別名衝突的時候無法正常解析 -1.解決方式1 名稱空間: namespace path('app01/', include(('app01.urls', 'app01'), namespace='app01')) path('app01/', include(('app01.urls', 'app02'), namespace='app02')) -2.解決方式2: - 別名不衝突即可 - 保證django專案下沒有重複的別名即可