Django學習筆記:第三章D的路由和檢視

2023-07-23 06:00:24

1.網站的入口--路由和檢視

URL是網站Web服務的入口。使用者在瀏覽器輸入URL發出請求後,django會根據路由系統,執行對應的檢視函數,然後返回資訊到瀏覽器中。

1.1 認識路由

建立專案時,會自動生成urls.檔案,檔案中定義了專案的路由資訊,成為專案的路由解析入口。在自建的應用中可以手動設定獨立的urls.py檔案。

1.1.1 路由系統的基本設定

urls.py檔案

from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    path('index/', views.index, name='index'),
]

先匯入對應的檢視函數,然後在urlpatterns列表中進行url路由設定

path設定語法

path(路由, 檢視函數, 別名)

1.1.2 用「路由包含」簡化專案複雜度

思路:為每個應用建立一個urls.py檔案,將應用的路由設定分別單獨放置。

使用者發起請求時,會從根路由尋找每個應用的路由資訊,生成完整的路由列表。

路由設定規則:

urlpatterns列表會從上到下進行匹配

  • 匹配成功,會根據檢視函數進行跳轉

  • 匹配失敗,則返回404錯誤

  • 若定義了子路由,則在跟路由中使用include('應用名.urls') 來載入子路由。如果urls的第一部分被匹配看,則其餘部分會在子路由中進行匹配。

  • 路由資訊一般以/ 結尾

1.1.3 include使用方法

在 Django 專案中,我們可以通過 URLconf 檔案(即 views.py 檔案)來定義路由規則。而在這個 URLconf 檔案中,我們可以使用 include() 函數來指定自己應該包含的其它 URLconf 模組。

通過include可以設定多級路徑,語法:

path('', include('應用名稱.urls'))
urlpatterns = [
    path('', include('myapp.urls'))
]

然後在對應的應用路由檔案和檢視函數進行設定

myapp的urls.py

from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
	path('myapp/index/', views.index)
]

myapp的views.py

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse

def index(request):
	return render(request, 'myapp/index.html')

1.1.3 實戰一下

  • 在專案根目錄執行
python manage.py startapp myapp1
python manage.py startapp myapp2

建立兩個應用,myapp1 myapp2

  • 在專案的路由檔案中設定
urlpatterns = [
    path('', v.index),  # 這裡設定了啟動的預設頁面
    path('admin/', admin.site.urls),
    path('index/', v1.index, name='index'),
    path('', include('myapp.urls')),
    path('', include('myapp1.urls')),
    path('', include('myapp2.urls'))
]

然後在依次對應用的路由和檢視函數進行設定(沒有則建立)

  • 在模板中進行html檔案編寫

  • 啟動應用
python manage.py runserver

1.2 路由引數

我們不可能為所有頁面都手動設定路由規則,需要引入URL引數進行動態設定。

1.2.1 編寫帶URL引數的路由

Django動態URL的作用是根據特定的引數動態生成URL。這樣,我們可以使用相同的檢視函數和模板來處理不同的請求,而不必為每個請求編寫單獨的檢視函數。

這個動態的意思是:根據使用者輸入的地址資訊來顯示對應的頁面資訊。

  • 設定

myappurls.py

urlpatterns = [
	path('myapp/index/', views.index),
    path('myapp/show/<int:id>/', views.show),
]

myappviews.py 增加show函數

def show(request, id):
	return HttpResponse('myapp中的show方法, 引數為id, 值為' + str(id))
  • 啟動專案

1.2.2 介紹URL引數

在上面的例子中,路由設定為

path('myapp/show/<int:id>/', views.show),

< > 中的內容就是URL引數,語法:

<引數資料型別 : 引數名稱>

URL引數有4種資料型別

引數資料型別 說明
str 任意非空字串,不包含/ ,預設型別
int 匹配0和正整數
slug 匹配任何ASCII字元,連線符和下劃線
uuid 匹配一個UUID格式的字串,該物件必須包括- ,所有字母必須小寫。

1.2.3 [實戰] 用re_path() 方法正則匹配複雜路由

與path方法作用一樣,多了個可以使用正規表示式的功能。

與path一樣,使用時,需要匯入模組:

from django.urls import re_path

語法:

(?P<name>pattern)   
# name是匹配的字串名稱,pattern是要匹配的模式
# name並不會顯示在位址列中,只有被匹配的字元才會出現在位址列
# 可以同時有多個表示式,用&連線

一個例子

myapp應用中,設定urls.py 獲取4個數位賦值給year

urlpatterns = [
    path('myapp2/index/', views.index),
    re_path(r'myapp2/list/(?P<year>\d{4})/', views.article_list),
]

myapp應用中,設定views.py

def article_list(request, year):
	return HttpResponse("myapp2中的article方法, 引數為year, 指定4位元, 值為" + str(year))
  • 啟動

輸入超過4個或少於4個 都會存取失敗

1.2.4 反向解析路由

反向解析路由是指通過給定的URL路徑反向得到Django中定義的路由。它的作用是方便在程式碼中生成URL,而不需要手動拼接URL。

路由正常進行設定

path('myapp/url_reverse', views.url_reverse, name = 'myapp_url_reverse')
  • name後面名稱最好為應用名_檢視函數名稱
  • name相當於設定項的別名。可以在檢視函數或是模板的HTML檔案中呼叫它
  • 根據name得到路由設定中的URL地址,這就是 反向解析路由
  • 優點:只要name不變,URL地址可以任意改變

例子

myapp1 中進行設定

urls.py

path('myapp1/url_reverse/', views.url_reverse, name = 'myapp1_url_reverse')

views.py

from django.urls import reverse # 記得匯入
def url_reverse(request):
	# 進行反向解析
	print('反向解析結果:' + reverse('myapp1_url_reverse'))
	return render(request, '2/url_reverse.html')

在模板中新建檔案 2/url_reverse.html,新增程式碼

<div>
    在HTML中使用url標籤進行反向解析
    <br>
    {% url 'myapp1_url_reverse' %}
</div>

啟動!