Django入門學習--配置路由(urls)


URL(Uniform Resource Locator,統一資源定位符)是對可以從互聯網上得到的資源位置和訪問方法的一種簡潔的表示,是互聯網上標准資源的地址。互聯網上的每個文件都有一個唯一的URL,用於指出文件的路徑位置。簡單地說,URL就是常說的網址,每個地址代表不同的網頁,在Django中,URL也稱為URLconf。

創建urls.py文件

在每個App中添加一個空白內容的urls.py文件
image.png

編寫URL的規則

在App里添加urls.py是將屬於App的URL都寫入到該文件中,而項目根目錄的urls.py是將每個App的urls.py統一管理。當程序收到用戶請求的時候,首先在根目錄的urls.py查找該URL是屬於那個App,然后再從App的urls.py找到具體的URL信息。

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('index.urls')),  # 127.0.0.1:8000/index
]
  • from django.contrib import admin:導入Admin功能模塊。
  • from django.urls import path,include:導入URL編寫模塊。
  • urlpatterns:整個項目的URL集合,每個元素代表一條URL信息

path('admin/', admin.site.urls):設定Admin的URL。'admin/'代表127.0.0.1:8000/admin地址信息,admin后面的斜杠是路徑分隔符;admin.site.urls是URL的處理函數,也稱為視圖函數。
path(' ',include('index.urls')):URL為空,代表為網站的域名,即127.0.0.1:8000,通常是網站的首頁;include將該URL分發給index的urls.py處理。由於首頁的地址分發給index的urls.py處理,因此下一步需要對index的urls.py編寫URL信息,代碼如下:

from django.urls import path
from . import views
urlpatterns = [
    path('/', views.index),   # views.index 對應 index目錄下的views.py里面的index視圖函數
]

index的urls.py的編寫規則與根目錄的urls.py大致相同。下面需要實現index目錄下的視圖函數index

# 在index目錄下的views里面添加下面的視圖函數
from django.shortcuts import render
from django.http import  HttpResponse
# Create your views here.

def index(request):
    return HttpResponse("Hello Django.")

在瀏覽器輸入127.0.0.1:8000 ,進行測試。
image.png

編寫帶變量的URL

URL的變量類型有字符類型、整型、slug和uuid,最為常用的是字符類型和整型。各個類型說明如下。
• 字符類型:匹配任何非空字符串,但不含斜杠。如果沒有指定類型,默認使用該類型。
• 整型:匹配0和正整數。
• slug:可理解為注釋、后綴或附屬等概念,常作為URL的解釋性字符。可匹配任何ASCII字符以及連接符和下畫線,能使URL更加清晰易懂。比如網頁的標題是“13歲的孩子”,其URL地址可以設置為“13-sui-de-hai-zi”。
• uuid:匹配一個uuid格式的對象。為了防止沖突,規定必須使用破折號並且所有字母必須小寫,例如075194d3-6885-417e-a8a8-6c931e272f00。
例如:在index目錄的urls里面添加下面的語句,並且實現對應的視圖函數madate:

# index.urls 
from django.urls import path
from . import views
urlpatterns = [
    path('', views.index),
    path('<year>/<int:month>/<slug:day>',views.mydate), #添加該句
]

# index.views 添加下面的視圖函數
def mydate(requset, year, month, day):
    return HttpResponse(str(year) + '-' + str(month) + '-' + str(day))

image.png
為了進一步規范日期格式,可以使用正則表達式限制URL的可變范圍。正則表達式的URL編寫規則如下:

from django.urls import path,re_path
from . import views
urlpatterns = [
    path('', views.index),
    # path('<year>/<int:month>/<slug:day>',views.mydate),
    re_path('(?P<year>[0-9]{4}) /(?P<month>[0-9]{2}) / (?P<day>[0-9]{2})',views.mydate),
    # 限定年份有4位數字,月有兩位數字,日有兩位數字
]

剛剛的4要改為04才能正確顯示網頁:
image.png

設置參數name

除了在URL里面設置變量之外,Django還可以對URL進行命名。在index的urls.py、views.py和模板myyear.html中添加以下代碼:

# urls.py 添加該內容
from django.urls import path,re_path
from . import views
urlpatterns = [
    path('', views.index),
    # path('<year>/<int:month>/<slug:day>',views.mydate),
    # re_path('(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})',views.mydate),
    # 在路由中帶了一個變量myyear,該變量供跳轉到的頁面使用。
    re_path('(?P<year>[0-9]{4}).html', views.myyear, name='year'), 

]
# views.py 里面添加該內容
def myyear(request, year):
    return render(request,'year.html') 

year.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 		<div><a href="/2018.html">點擊跳轉到2018.html</a></div>
   # 使用URL中設置的參數,無論URL信息如何變化,都不用更改模板里面的內容
   # 但是上面這種方法,如若URL信息變了,則要做變更,比如改為 /a/2018.html
    <div><a href="{% url 'year' 2018 %}">通過url實現,點擊跳轉到2018.html</a></div>
    <div><a href="{% url 'year' 2019 %}">點擊會調到2019.html</a></div>
</body>
</html>

image.pngimage.png
上述代碼分別從URL、視圖函數和HTML模板來說明參數name的具體作用,整個執行流程如下:
(1)當用戶訪問該URL時,項目根據URL信息選擇視圖函數myyear處理,並將該URL命名為myyear。
(2)視圖函數myyear將模板myyear.html作為響應內容並生成相應的網頁返回給用戶。
(3)在模板myyear.html中分別設置兩個標簽a,雖然兩個標簽a的href屬性值的寫法有所不同,但實質上兩者都指向命名為myyear的URL地址信息。
(4)第二個標簽a的href為{% url 'myyear' 2018 %},這是Django的模板語法,模板語法以{%%}表示。其中,url 'myyear'是將命名為myyear的URL地址信息作為href屬性值;2018是該URL的變量year,若URL沒有設置變量值,則無須添加。
從上述例子可以看到,模板中的myyear與urls.py所設置的參數name是一一對應的。參數name的作用是對該URL地址信息進行命名然后在HTML模板中使用可以生成相應的URL信息。
此外,在以往,大多數開發者都是采用第一種方法在模板上設置每個標簽a的href屬性值,如果URL地址信息發生變更,就要修改每個標簽a的href屬性值,這種做法不利於URL的變更和維護。而在URL中設置參數name,只要參數name的值不變,無論URL地址信息如何修改都無須修改模板中標簽a的href屬性值。

設置額外參數

除了參數name之外,還有一種參數類型是以字典的數據類型傳遞的,該參數沒有具體命名,只要是字典形式即可,而且該參數只能在視圖函數中讀取和使用。其代碼如下:
image.png
image.png         image.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM