一.路由層之路由匹配
1.什么是路由
- 路由可以看成是跟在 ip 和 port 之后的地址

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內部重定向在匹配一次

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

建議自動添加
二.分組命名匹配
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, 但我們是可以對文章內容進行修改的

ps : 再如何優化也比不過加錢居士
4.修改匹配規則實作偽靜態
- 路由層檔案
urlpatterns = [
re_path(r'home.html/',views.home_func),
]
# 訪問 : 127.0.0.1:8888/home.html/
七.Django版本區別
Django 1.x 版本與 2.x、3.x 版本的區別
1.路由層中的路由匹配方法
1.x中使用的是 url( ) 方法, 第一個引數是正則運算式2.x與3.x中使用的是 path( ) 方法, 第一個引數不支持正則運算式, 些什么就匹配什么
如果想要在
2.x和3.x中的第一個引數中使用正則運算式, 則需要匯入 re_path 方法from django.urls import path,re_pathre_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 檔案里面就是該專案所依賴的庫以及對應的版本

- 使用下面命令自動安裝所有依賴項
pip install -r requirements.txt
3.虛擬環境說明
- 創建虛擬環境類似于你重新下載了一個純凈的Python解釋器(里面只有 pip 和 setuptools 工具)
- 反復的創建虛擬環境類似于反復的下載Python解釋器, 會消耗一定的硬碟空間
- 目前不推薦使用虛擬環境, 所有的模塊統一都下載到本地
4.創建虛擬環境
- 打開pycharm----->File----->New Project----->Pure Python

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

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/270935.html
標籤:架構設計
