主頁 > 軟體設計 > 🍖Django框架之路由層 ?

🍖Django框架之路由層 ?

2021-04-01 21:56:47 軟體設計

一.路由層之路由匹配

1.什么是路由

  • 路由可以看成是跟在 ip 和 port 之后的地址

image-20210316195939091

2.url( ) 方法

# 示例
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login_func),
    url(r'^register/$', views.register_func),
]
  • url( ) 方法的第一個引數其實是正則運算式, 一旦第一個引數匹配到了內容直接結束匹配, 并呼叫對應的視圖函式

3.路由匹配注意事項

  • 不需要在路由前面添加反斜杠 "/", 因為每個 url 自帶
  • 建議在正則運算式之前添加原生字符 "r"
  • 每個由正則匹配成功并通過分組捕獲的引數都會作為一個普通的Python字串傳遞給視圖函式
  • 如果路由結尾沒有"/", 在第一次正則匹配機制沒有匹配到想要的內容時, 會在匹配字符后加一個"/", 然后Django內部重定向在匹配一次

image-20210316201356011

4.取消自動添加斜杠 "/"

  • 上面測驗了路由后面不添加"/"一共匹配了兩次
  • 而自動添加斜杠這種操作是可以取消的
# setting.py 檔案
APPEND_SLASH = False  # 默認 True 自動添加斜杠
  • 設定之后如果不添加斜杠就無法訪問資源

image-20210316202018217

建議自動添加

二.分組命名匹配

1.無名分組

  • url( ) 方法中第一個引數正則運算式分組 : 給正則運算式前后加一個小括號

  • 會將括號內正則運算式匹配到的內容當做位置引數傳遞給后邊的視圖函式

url(r'^login/$', views.login_func)

# 無名分組 
url(r'^login/(\d+)/$', views.login_func)
# 視圖函式
def login_func(request,*args):
    print(args)
    return Httpresponse(args)

2.有名分組

  • 將正則運算式分組捕獲到的內容定義一個名字
  • 會將括號內正則運算式匹配到的內容當做關鍵字引數傳遞給后面的視圖函式
url(r'^login/$', views.login_func)

# 有名分組
url(r'^login/(?P<id>\d+)/$', views.login_func)
# 視圖函式
def login_func(request,**kwargs):
    print(kwargs)
    return Httpresponse(args)

3.無名有名是否可以結合使用

  • 不能結合使用
url(r'^login/(\d+)/(?P<id>\d+)/$', views.login_func)
# 官方說不能混著用, 混著用只能取到有名分組捕獲的值
# 只要不混著用,有名分組和無名分組支持多個相同型別的傳參
  • 可以單個重復使用
url(r'^login/(\d+)/(\d+)/$', views.login_func)
url(r'^login/(?P<id>\d+)/(?P<id>\d+)/$', views.login_func)

三.反向決議

1.什么是反向決議

  • 反向決議就是通過一些方法得到一個結果, 該結果可以直接訪問對應的 url 并觸發視圖函式

2.反向決議的作用

  • 在使用一個 Django 專案時, 我們經常需要將一個 url 嵌入到生成的內容中去, 如果將這些 url 固定寫死, 那么可擴展性很差, 并且一定程度上會產生過期的 url
  • 使用反向決議就是當路由頻繁變化的時候, 讓 html 界面上的連接地址做到動態決議

3.如何使用反向決議

  • 給路由與視圖函式對應關系添加一個別名 (名字由自己指定, 只要不沖突即可)
# 路由層
url(r'^login/$', views.login_func,name='login_name')
  • 根據該別名可動態決議出一個結果, 該結果可以直接訪問到對應的路由
# 前端中使用(模板層)
<a href="https://www.cnblogs.com/songhaixing/p/{% url'login_name' %}">登入</a>

# 后端中使用(視圖層)
from django.shortcuts import reverse
url = reverse('login_name')

ps : redirect( ) 括號內也可以直接寫別名

4.無名分組反向決議

  • 路由層配置
url(r'^login/(\d+)/', views.login_func,name='login_name')
  • 視圖層配置
from shortcuts import reverse
url = reverse('login_name',args=(1,))  # 隨便給個數字
  • 模板層
<a href="https://www.cnblogs.com/songhaixing/p/{% url'login_name' 1 %}">登入</a>  # 隨便給個數字

路由層中分組匹配得到的數字并不是我們這樣寫死的, 一般情況下放的是資料的主鍵值, 我們可以通過獲取到資料的主鍵.進而定位到資料物件, 從而可以對資料進行編輯和洗掉

# 路由層
url(r'^login/(\d+)/', views.login_func,name='login_name')

# 視圖層
def edit(request,edit_id):
    reverse('login_name',args=(edit_id,))
    
# 模板層
{% for user_obj in user_list %}
    <a href="https://www.cnblogs.com/songhaixing/p/{% url'login_name' user_obj.id %}">kkk</a>

5.有名分組反向決議

  • 路由層配置
url(r'^login/(?P<id>\d+)/', views.login_func,name='login_name')
  • 視圖層配置
from shortcuts import reverse
url = reverse('login_name',kwargs=(id:111))  # 隨便給個數字
url= =
reverse('login_name',args=(111,))      # 也可以這樣寫
  • 模板層配置
<a href="https://www.cnblogs.com/songhaixing/p/{% url'login_name' id=111 %}">登入</a>  # 隨便給個數字
<a href="https://www.cnblogs.com/songhaixing/p/{% url'login_name' 11 %}">登入</a>      # 也可以這樣寫

由上面的視圖層與模板層的第二種書寫方式可以看出 : 無名有名都可以使用一種反向決議形式 : 就是無名反向決議

四.路由分發

1.路由分發簡介

django是專注于開發應用的,當一個django專案特別龐大的時候, 所有的路由與視圖函式映射關系全部寫在一個 urls.py 里面很明顯太冗余并且不便于管理

其實django中的每一個應用都可以有自己的 urls.py、static檔案夾、templates檔案夾, 基于上述特點, 使用django做分組開發非常的簡便

每個人只需要寫自己的應用即可, 最后由組長統一匯總到一個空的django專案中然后使用路由分發將多個應用關聯到一起

  • 利用路由分發之后, 總路由不再干路由與視圖函式的直接對應關系, 而是做一個分發處理, 進而識別當前url所屬的應用, 最后直接分發給對應的應用去處理就行了, 并且應用路由重名也無關要緊

2.路由分發設定

  • 總路由檔案 : urls.py

??注意 : 總路由正則后面不能添加 "$", 不然一配到 app01 就結束了

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

# 方式一 : 復雜寫法
from app01 import urls as app01_ulrs
from app02 import urls as app02_ulrs
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^app01/', include(app01_ulrs)),
    re_path(r'^app02/', include(app02_ulrs)),
    re_path(r'^app03/', include(app03_ulrs))
]

# 方式二 : 高級寫法
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^app01/', include('app01.ulrs')),
    re_path(r'^app02/', include('app02.ulrs')),
    re_path(r'^app03/', include('app03.ulrs'))
]
  • 每個應用路由(子路由)檔案 : urls.py
from django.contrib import admin
from django.urls import path,re_path
from [app名] import views

urlpatterns = [
    re_path(r'^home/',views.home_func),
    re_path(r'^index/',views.index_func),
    re_path(r'^edit/',views.edit_func),
]

五.名稱空間

1.為什么使用名稱空間

當多個應用設定了相同的別名, 在反向決議的時候前面路由會被后面的路由覆寫, 那么就無法觸發前面路由對應的視圖函式, 正常情況下, 反向決議是無法自動識別前綴的, 為了避免這種錯誤, 引入了名稱空間

2.應用命名空間與實體命名空間

  • name_app : 應用命名空間 : 通常在應用app的urls.py檔案中指定 (Django2版本以后不指定報錯)
# app01
app_name='app01'  # 應用命名空間
urlpatterns = [
    re_path(r'^home/',views.home_func,name='home_name')
]
  • namespace : 實體命名空間 : 通常在總路由檔案中指定

2.解決方式1 : 使用名稱空間

  • 總路由設定 : urls.py 檔案
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^app01/', include('app01.ulrs',namespace='app01')),
    re_path(r'^app02/', include('app02.ulrs',namespace='app02')),
    re_path(r'^app03/', include('app03.ulrs',namespace='app03'))
]
  • 子路由設定 : urls.py 檔案
# app01
app_name='app01'
urlpatterns = [
    re_path(r'^home/',views.home_func,name='home_name')
]

# app02
app_name='app02'
urlpatterns = [
    re_path(r'^home/',views.home_func,name='home_name')
]

# app03
app_name='app03'
urlpatterns = [
    re_path(r'^home/',views.home_func,name='home_name')
]
  • 視圖檔案 : views.py 檔案
# app01
from django.shortcuts import reverse
def home_func(request):
    res = reverse('app01:home_name')
    return HttpResponse(res)  # /app01/home/

# app02
from django.shortcuts import reverse
def home_func(request):
    res = reverse('app02:home_name')
    return HttpResponse(res)  # /app02/home/

# app03
from django.shortcuts import reverse
def home_func(request):
    res = reverse('app03:home_name')
    return HttpResponse(res)  # /app03/home/
  • 模板層檔案
<a href="https://www.cnblogs.com/songhaixing/p/{% url'app01:name_name' %}">app01</a>
<a href="https://www.cnblogs.com/songhaixing/p/{% url'app02:home_name' %}">app02</a>
<a href="https://www.cnblogs.com/songhaixing/p/{% url'app03:home_name' %}">app03</a>

3.解決方式二 : 手動添加前綴

# app01
urlpatterns = [
    re_path(r'^home/',views.home_func,name='app01_home_name'),
]

# app02
urlpatterns = [
    re_path(r'^home/',views.home_func,name='app02_home_name'),
]

# app03
urlpatterns = [
    re_path(r'^home/',views.home_func,name='app03_home_name'),
]

六.偽靜態

1.靜態頁面

  • 寫好的頁面, 資料已經固定死了不會變化

2.動態頁面

  • 頁面內容可以隨著時間、環境、或資料庫的變化而發生改變

3.偽靜態頁面

  • 目的是為了更好的被搜索引擎收錄以及seo查詢幾率而通過一定的規則, 把動態頁面的地址轉換成以 htm 或 html 結尾的地址, 看起來是靜態的, 實際是依然是動態頁面
  • 比如博客園的文章地址結尾就是 .html, 但我們是可以對文章內容進行修改的

image-20210317181842995

ps : 再如何優化也比不過加錢居士

4.修改匹配規則實作偽靜態

  • 路由層檔案
urlpatterns = [
    re_path(r'home.html/',views.home_func),
]
# 訪問 : 127.0.0.1:8888/home.html/

七.Django版本區別

Django 1.x 版本與 2.x3.x 版本的區別

1.路由層中的路由匹配方法

  • 1.x 中使用的是 url( ) 方法, 第一個引數是正則運算式
  • 2.x3.x 中使用的是 path( ) 方法, 第一個引數不支持正則運算式, 些什么就匹配什么

如果想要在 2.x3.x中的第一個引數中使用正則運算式, 則需要匯入 re_path 方法

from django.urls import path,re_path

re_path 等價于 1.x 中的 url 方法

2.path 方法中的五種常用轉換器

str : 匹配除了路徑分隔符(/)之外的非空字串,這是默認的形式
int : 匹配正整數,包含0,
slug : 匹配字母、數字以及橫杠、下劃線組成的字串,
uuid : 匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00,
path : 匹配任何非空字串,包含了路徑分隔符(/)(不能用?號)

3.自定義轉換器

class MonthConverter:
    regex='\d{2}' # 屬性名必須為regex

    def to_python(self, value):
    return int(value)

    def to_url(self, value):
    return value  # 匹配的regex是兩個數字,回傳的結果也必須是兩個數字

from django.urls import path,register_converter
from app01.path_converts import MonthConverter

# 注冊轉換器
register_converter(MonthConverter,'mon')

from app01 import views
urlpatterns = [
    path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='date_time'),

]

八.安裝本地虛擬環境

1.為什么使用本地虛擬環境

  • 在時間開發程序中,我們會給不同的專案配備不同的環境
  • 專案用到什么就裝什么,用不到的一概不裝
  • 不同的專案解釋器環境都不一樣

2.requirements.txt 是什么

  • 使用別人寫好的專案需要安裝一大堆的庫
  • 而 requirements.txt 檔案里面就是該專案所依賴的庫以及對應的版本

image-20210317190243650

  • 使用下面命令自動安裝所有依賴項
pip install -r requirements.txt

3.虛擬環境說明

  • 創建虛擬環境類似于你重新下載了一個純凈的Python解釋器(里面只有 pipsetuptools 工具)
  • 反復的創建虛擬環境類似于反復的下載Python解釋器, 會消耗一定的硬碟空間
  • 目前不推薦使用虛擬環境, 所有的模塊統一都下載到本地

4.創建虛擬環境

  • 打開pycharm----->File----->New Project----->Pure Python

fb7b20985abd5686cf1b51c8ca3e37d

  • 創建成功查看初始的 package : 打開Pycharm----->File----->settings----->Project:[專案名]----->Python Interpreter

de9fa8ea9afe575dc38815b095ed4d0

  • 下次創建新專案可以直接選擇已經創建好的虛擬環境

image-20210317191217096

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/270935.html

標籤:架構設計

上一篇:互聯網醫院實施方案(一)實施前準備

下一篇:怎樣從臟亂差的醫療大資料中提取價值(一)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more