python測試開發django-4.url動態傳值

1.前言

我們在瀏覽器訪問一個網頁A是通過一個指定的url地址去訪問的。但在瀏覽器用一個不存在的url地址去執行訪問是打不開正確的網頁的,只會打開一個瀏覽器自帶的有錯誤提示的網頁。

在django框架,管理url配置的唯一一個py文件是【urls.py】。

我們按照一個實際的項目來說明,比如在django項目【helloworld】裏,管理url配置的唯一一個【urls.py】所在的絕對路徑是【helloworld/helloworld/urls.py】。用比較接地氣的話來描述,就是所有用戶從瀏覽器發送的任何一個訪問django項目【helloworld】的urlB都會在【helloworld/helloworld/urls.py】這個urls.py裏進行url規則匹配:如果urlB有先符合哪個匹配規則的,就執行後續流程(後續流程不具體展開描述);如果urlB都沒符合哪個匹配規則的,就執行相關拋出錯誤的操作從而達到閉環(相關拋出錯誤的操作不具體展開描述);

舉個例子W:假如一個存儲商品的商品數據表good有2000條商品數據,這2000條商品數據要在一個頁面C全部展示時,按照實際開發經驗肯定要有翻頁功能來進行數據展示的情況,所以翻頁控件的頁數是不固定的。假如頁數對應的入參名爲page,那麼傳遞給後端接口的入參page值就是不固定的,比如:page=1,或者page=20;
所以,結合例子W來提出一個問題:當一個url路徑裏面帶參數時候如何去處理呢?

2.urls.py配置規則

由於目前django版本比較多,在查資料時候,也會看到不同的版本用不同寫法,對於我們初學者來說是比較迷惑的。
總結了下,我們只需要瞭解這三個函數即可:path、re_path、url,接下來具體分析下這三個有什麼區別。

  • path         只能絕對匹配路徑地址,不支持正則匹配。(該函數,目前很少有開發人員使用)
  • re_path    支持正則匹配。(該函數,只在django1.x版本常用,django2.x版本和更高版本基本很少使用)
  • url            支持正則匹配。(實際上該url函數的返回值是返回re_path函數的返回值。)(該函數,django2.x版本和更高版本基本都會使用,強烈推薦統一使用該函數)

所以,後續我們統一使用url函數!另外兩個函數只需要大概瞭解一下即可!

from django.urls import re_path,path
from hello import views

urlpatterns = [
    path("index/",views.index),
    re_path("^$",views.zhuye),
    url("^demo/$",views.demo),
]

 

 在瀏覽器上分別訪問:http://127.0.0.1:8000/index/,  http://127.0.0.1:8000/,  http://127.0.0.1:8000/demo/ ,發現都能正確訪問到對應內容。

 

 

 

 

 

 打開函數path和函數re_path源碼,就能看到函數path的匹配規則是RoutePattern(絕對匹配),函數re_path的匹配規則是RegexPattern(正則匹配)。

 

 注意事項:

比如我們在瀏覽器上輸入一個地址【http://127.0.0.1:8000/demo】後點擊發送請求,地址會變爲【http://127.0.0.1:8000/demo/】,也就是說會在【demo】後面自動加上一個【/】。

 

比如我們在瀏覽器上輸入一個地址【http://127.0.0.1:8000/】後點擊發送請求,地址會變爲【http://127.0.0.1:8000】,也就是說會在【8000】後面自動刪掉一個【/】。

所以,不管是使用url函數,還是使用path函數,還是使用re_path函數,匹配路徑統一在後面要加個【/】,但是匹配路徑前面不需要加【/】(因爲django框架會自動添加),比如:【index/】 、【demo/】、【demo/page/】。

比如在本地django項目【helloworld】有個【url("^demo/$",views.demo)】,那麼django框架會獲取到項目【helloworld】啓用服務後的當前基本路徑信息【http協議或者https協議://IP地址:開啓服務的端口號/】比如爲【http://127.0.0.1:8000/】,結合【url("^demo/$",views.demo)】,就能得到一個url的絕對訪問地址【http://127.0.0.1:8000/demo/】。任一個用戶在瀏覽器上只能輸入【http://127.0.0.1:8000/demo/】才能訪問並查看到demo函數所返回的demo.html頁面內容。

 

 

 

 

舉個反例:比如在本地django項目【helloworld】有個【url("^demo$",views.demo)】,但任一個用戶在瀏覽器上輸入【http://127.0.0.1:8000/demo/】,看用戶會看到什麼頁面內容?

 

 

 

3.urls是部分動態

3.1.當訪問的頁面展示的數據較少且沒有分頁的情況,只有1頁的時候,對應的頁數就能寫死,對應的url配置規則可以寫成這樣【url("^demo/page=1$",views.demo)】。

 

 

 

 

 3.2.1.當訪問的頁面展示的數據較多且有分頁的情況,對應的頁數就不能寫死,對應的url配置規則就不能繼續寫成這樣【url("^demo/page=1$",views.demo)】,否則用戶想訪問第二頁的數據時django框架會返回給用戶一個錯誤的提示頁面。

 

 

 

3.2.2.所以如果想匹配任意的頁面,對應的url配置規則可以寫成這樣【url("^demo/page=\d+$",views.demo)】(匹配任意數字,可以用正則【\d+】)。

 

 

 比如我要訪問第二頁的數據,是能成功訪問的:

 

 

 3.2.3.通過3.2.2的配置,我們可以在瀏覽器上輸入任意page頁數訪問到同一個視圖函數【demo】,但這依然不是我們想要的結果。我們希望傳不同的page頁數,能訪問到不同的網頁內容!所以我們接下來就是要寫一個新的視圖函數【page】!

第一步:我們在【helloworld/hello/views.py】裏寫帶一個參數【random_num】的視圖函數【page】,並且加個異常校驗【當輸入的page頁數值不是數字,就拋個異常404頁面】。

第二步:接着,我們在【helloworld/helloworld/urls.py】寫上一個對應的url匹配規則。

 url的簡單使用可以先參考該網址:https://blog.csdn.net/weixin_45414731/article/details/99751732。

 

 

url的詳細使用可以查看django官方網址:https://docs.djangoproject.com/en/3.1/topics/http/urls/。

 

 

 

 第三步:接着,我們在瀏覽器上輸入對應的page值爲正整數,都能正確給用戶展示不同的頁面結果!

比如輸入:【http://127.0.0.1:8000/demo/page=3】、【http://127.0.0.1:8000/demo/page=7】。

 

 

 

 

 

 

第四步:接着,我們在瀏覽器上輸入對應的page值爲非數字,都只會給用戶返回一個錯誤的報錯頁面。

比如輸入:【http://127.0.0.1:8000/demo/page=我】。

 

 

 看到這樣的報錯頁面,是因爲django項目【helloworld】的【helloworld/helloworld/setting.py】裏有個常量DEBU值爲True。如果將常量DEBUG的值改爲False,並且重啓django項目【helloworld】的服務後,重新在瀏覽器用這個地址【http://127.0.0.1:8000/demo/page=我】進行訪問,都只會給用戶返回一個標準的404頁面。

 

 

 

 

 

 

 

 

 

注意點:由於處於開發階段,DEBUG 默認爲True。當產品開發完成且產品正式發佈上線時,需要將DEBUG = False,這樣用戶訪問到的錯誤頁面就都會是標準的404頁面。

 

 

4.常量【ALLOWED_HOSTS】的簡單使用

 

 

 在django項目【helloworld】,常量【ALLOWED_HOSTS】是隻存儲在【helloworld/helloworld/setting.py】裏。

常量【ALLOWED_HOSTS】的數據類型是list。默認值爲空list,表示只允許本地的localhost或本地的127.0.0.1在瀏覽器上訪問該django項目【helloworld】。

如果想讓所有的域名都能訪問django項目【helloworld】,可以設置爲:ALLOWED_HOSTS = ["*"] 。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章