# 1.網站的入口--路由和視圖 URL是網站Web服務的入口。用戶在瀏覽器輸入URL發出請求後,django會根據路由系統,運行對應的視圖函數,然後返回信息到瀏覽器中。 ## 1.1 認識路由 創建項目時,會自動生成urls.文件,文件中定義了項目的路由信息,成為項目的路由解析入口。在自建的應用中 ...
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。這樣,我們可以使用相同的視圖函數和模板來處理不同的請求,而不必為每個請求編寫單獨的視圖函數。
這個動態的意思是:根據用戶輸入的地址信息來顯示對應的頁面信息。
- 配置
在myapp
的urls.py
urlpatterns = [
path('myapp/index/', views.index),
path('myapp/show/<int:id>/', views.show),
]
在myapp
的views.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>
啟動!