django2
路由控制器
Route路由,是一種映射關系,路由是把客戶端請求的url路徑和用戶請求的應用程式,這里意指django里面的視圖進行系結映射的一種關系,
請求路徑和視圖函式不是一一對應的關系
在django中所有的路由最終都被保存到一個叫urlpatterns的檔案里,并且該檔案必須在主應用下的urls.py里進行宣告,這是由setting檔案決定的
在django運行中,當客戶端發送了一個http請求到服務端,服務端的web服務器則會從http協議中提取url地址, 從程式內部找到專案中添加到urlpatterns里面的所有路由資訊的url進行遍歷匹配,如果相等或者匹配成功,則呼叫當前url物件的視圖方法,
(1)include基本使用

其實在于專案名同名的app檔案下的urls.py里有提供一段路由的使用,第三個使用的就是include函式
具體使用方法就是首先要匯入這個模塊和路由
from django.urls import include, path, re_path
urlpatterns = [
path('ZJR/',include('ReginaApp.urls'))
]
ReginaApp.urls這個檔案是不存在的,所以直接手動創建一個
from django.urls import path, include
from django.shortcuts import HttpResponse
from ReginaApp import views
urlpatterns = [
path('regina/',views.get_ZJR)
]
這樣做的目的就在于我們可以把路由分級,不需要把所有的路由函式都堆在同一個目錄下面,當我們再訪問127.0.0.1:8090時,此時是報錯的,因為總路由里面沒有根目錄這個東西,如果想訪問到get_ZJR這個視圖函式,url需要加上ZJR/regina

(2)re_path基本使用
re_path和path的作用是一樣的,只不過're_path'是在寫url的時候可以用正則運算式,功能更加強大
寫正則運算式都推薦使用原生字串,也就是以‘r’開頭的字串
在正則運算式中定義變數,需要使用圓括號括起來,這個引數是有名字的,那么需要使用'?P<引數的名字>',然后在后面添加正則運算式的規則,
Eg:
(一)固定輸出
在選擇某個月的日歷的時候,輸入年月會相應的回傳當時的文章
#djangoRegina.urls:
path('1999-12',views.article)
# reginaApp.views:
def article(request):
return HttpResponse("1999-12 文章")

那如果我要挑選的選項很多,path就會有非常多的路由要一一列舉,所以這樣做就很繁瑣,
(二)加入正則
d表示數字,我們將原來的路由改為
re_path("article/\d{4}/\d{2}/",views.article)

但是這樣做,多月兩位數月份就合理,一位數月份就會報錯

所以再把格式修改一下re_path("article/\d{4}/\d{1,2}/",views.article)

(三)匹配引數
上圖得知,我需要根據url里得到的年份去匹配文章,所以在路由中就要進行分組
re_path("article/(\d{4})/(\d{1,2})/",views.article)
def article(request,year,month):
return HttpResponse("{}-{} 文章".format(year,month))


(四)覆寫
re_path("regina/(\d{4})/",views.articleByYear),
re_path("regina/(\d{4})/(\d{1,2})/",views.articleByMonth)
在擁有相同的路由的時候,更短的路由具有更高的優先級
def articleByYear(request,year):
return HttpResponse("{}文章".format(year))
def articleByMonth(request,year,month):
return HttpResponse("{}-{}文章".format(year,month))

如果想要區分開路由,則需要添加\(符號`re_path("regina/(\d{4})/\)",views.articleByYear),`

(五)有名分組
顧名思義想給我選定的分組起個名字,如果在不起名字的時候,視圖函式的引數順序是必須要固定的,亂序則會影響功能,所以給起個名字
re_path("regina/(?P<year>\d{4})/(?P<month>\d{1,2})/",views.articleByMonth)
def articleByMonth(request,month,year):
return HttpResponse("{}-{}文章".format(year,month))

(3)路由轉發器
首先要在app下匯入from django.urls import register_converter
#APP.urls
from django.urls import register_converter
class MobileConvert():
regex = '1[3-9]\d{9}'
def to_python(self,value):
print(type(value))
# 將匹配結果傳遞到視圖內部時使用
# 回傳str還是int主要看需求,純數字的可以回傳int
return value
# register_converter(路由轉換器的類名,呼叫別名)
register_converter(MobileConvert,"mobile")
urlpatterns = [
path('regina/',views.get_ZJR),
path("<mobile:number>",views.ZJrui) 這里的mobile要和注冊時起的名字一致
#APP.views 這里的number要和路由中命名的名字一致
def ZJrui(request,number):
return HttpResponse("HI,{}用戶".format(number))

(4)反向決議
這樣做的好處就是可以把每一個正則規則放到子app下面
在使用Django 專案時,一個常見的需求是獲得URL 的最終形式,以用于嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用于處理服務器端的導航(重定向等),人們強烈希望不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 毫不相關的專門的URL 生成機制,因為這樣容易導致一定程度上產生過期的URL,
在需要URL 的地方,對于不同層級,Django 提供不同的工具用于URL 反查:
- 在模板中:使用url模板標簽
- 在Python 代碼中:使用from django.urls import reverse 函式,
urls.py中為url設定別名引數:
from django.conf.urls import url
from . import views
urlpatterns = [
#...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...
]
應用之在模板中反向決議:
<a href="https://www.cnblogs.com/ivanlee717/p/{% url'news-year-archive' 2012 %}">2012 Archive</a>
<a href="https://www.cnblogs.com/articles/2012/">2012 Archive</a>
應用之在py文本中反向決議:
from django.shortcuts import redirect
from django.urls import reverse
def redirect_to_year(request):
year = 2006
reverse_path=reverse('news-year-archive', args=(year,))
return redirect(reverse_path) # 等效 redirect("/articles/2006/")
本文來自博客園,作者:ivanlee717,轉載請注明原文鏈接:https://www.cnblogs.com/ivanlee717/p/16565184.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501314.html
標籤:Python
上一篇:用戶的互動
