🍖Django框架之路由層 ⭐

一.路由層之路由匹配

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

建議自動添加html

二.分組命名匹配

1.無名分組

  • url( ) 方法中第一個參數正則表達式分組 : 給正則表達式先後加一個小括號前端

  • 會將括號內正則表達式匹配到的內容當作位置參數傳遞給後邊的視圖函數python

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="{% 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="{% 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="{% 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="{% url 'login_name' id=111 %}">登入</a>  # 隨便給個數字
<a href="{% url 'login_name' 11 %}">登入</a>      # 也能夠這樣寫

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

四.路由分發

1.路由分發簡介

django是專一於開發應用的,當一個django項目特別龐大的時候, 全部的路由與視圖函數映射關係所有寫在一個 urls.py 裏面很明顯太冗餘而且不便於管理後端

其實django中的每個應用均可以有本身的 urls.py、static文件夾、templates文件夾, 基於上述特色, 使用django作分組開發很是的簡便app

每一個人只須要寫本身的應用便可, 最後由組長統一彙總到一個空的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="{% url 'app01:name_name' %}">app01</a>
<a href="{% url 'app02:home_name' %}">app02</a>
<a href="{% 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

相關文章
相關標籤/搜索