django2 路由控制器 Route路由,是一種映射關係。路由是把客戶端請求的url路徑和用戶請求的應用程式,這裡意指django裡面的視圖進行綁定映射的一種關係。 請求路徑和視圖函數不是一一對應的關係 在django中所有的路由最終都被保存到一個叫urlpatterns的文件里,並且該文件必須在 ...
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="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
<a href="/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