Django路由层
路由層
?
?
?url攜帶的第一個參數就是正則表達式,
一旦前面匹配到了內容 就不會往下繼續匹配了? 而是執行相應的視圖函數
?
?
?像上方這樣的正則表達式 不管輸入testadd,還是test永遠無法執行testadd對應的視圖函數
正是由于上面的特性 當你的項目特別龐大的時候 url的前后順序也是你需要你考慮
極有可能會出現url錯亂的情況
django在路由的匹配的時候 當你在瀏覽器中沒有敲最后的斜杠
django會先拿著你沒有敲斜杠的結果取匹配 如果都沒有匹配上 會讓瀏覽器在末尾加斜杠再發一次請求 再匹配一次 如果還匹配不上才會報錯
如果你想取消該機制 不想做二次匹配可以在settings配置文件中 指定
APPEND_SLASH = False # 該參數默認是True
路由分發(重點)
當你的django項目特別龐大的時候 路由與視圖函數對應關系特別特別多
那么你的總路由urls.py代碼太過冗長 不易維護
每一個應用都可以有自己的urls.py,static文件夾,templates文件夾(******)
正是基于上述條件 可以實現多人分組開發 等多人開發完成之后 我們只需要創建一個空的django項目
然后將多人開發的app全部注冊進來 在總路由實現一個路由分發 而不再做路由匹配(來了之后 我只給你分發到對應的app中)
當你的應用下的視圖函數特別特別多的時候 你可以建一個views文件夾 里面根據功能的細分再建不同的py文件(******)
在多個app的情況下,我們路由層就不能像之前寫的一樣,而是要寫成類似于先把路由分發給各個app,每個app里面的路由層再進行分發
?
總路由中 一級路由的后面千萬不加$符號
?
?
?我們還需要將各個app中的urls導入并起別名,因為每個app中urls文件的名字相同
?進行app分發之前我們需要先導入include模塊
?
?
?再像這樣進行路由分發
app內的路由層還像之前一樣書寫
?
?
?不過我們的url就不能像之前一樣書寫了,要寫成127.0.0.1:8080/app01/index這樣的形式
無名分組
url(r'^test/([0-9]{4})/', views.test)
路由匹配的時候 會將括號內正則表達式匹配到的內容 當做位置參數傳遞給視圖函數
類似于test(request, num)調用函數
有名分組
url(r'^test/(?P<year>\d+)/', views.test)
?P<year>就是給后面匹配到的數字進行命名
路由匹配的時候 會將括號內正則表達式匹配到的內容 當做關鍵字參數傳遞給視圖函數
test(request,year=2019)
注意:有名分組和無名分組不能混合使用
但是 用同一種分組 可以使用多個
# 無名分組支持多個# url(r'^test/(\d+)/(\d+)/', views.test),# 有名分組支持多個# url(r'^test/(?P<year>\d+)/(?P<xx>\d+)/', views.test),反向解析
本質:其實就是給你返回一個能夠返回對應url的地址
1.先給url和視圖函數對應關系起別名
url(r'^index/$',views.index,name='kkk')
2.反向解析
后端反向解析
后端可以再任意位置通過reverse反向解析出對應的url
from django.shortcuts import render,HttpResponse,redirect,reverse
reverse? 需要先導入
reverse('kkk')? # 直接通過別名進行解析url地址
無名分組反向解析
url(r'^index/(\d+)/$',views.index,name='kkk')
后端反向解析
reverse('kkk',args=(1,))? ? # 后面的數字通常都是數據的id值
前端反向解析
{% url 'kkk' 1%}? ?# 后面的數字通常都是數據的id值
?
有名分組反向解析
同無名分組反向解析意義的用法
url(r'^index/(?P<year>\d+)/$',views.index,name='kkk')
后端方向解析
print(reverse('kkk',args=(1,)))? # 推薦你使用上面這種? 減少你的腦容量消耗
print(reverse('kkk',kwargs={'year':1}))
前端反向解析
<a href="{% url 'kkk' 1 %}">1</a>? # 推薦你使用上面這種? 減少你的腦容量消耗
<a href="{% url 'kkk' year=1 %}">1</a>
?
注意:在同一個應用下 別名千萬不能重復!!!
名稱空間(了解)
多個app的起了相同的別名 這個時候用反向解析 并不會自動識別應用前綴
如果想避免這種問題的發生
?
方式1:
總路由
url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))
后端解析的時候
reverse('app01:index')
reverse('app02:index')
前端解析的時候
{% url 'app01:index' %}
{% url 'app02:index' %}
方式2:
起別名的時候不要沖突即可? 一般情況下在起別名的時候通常建議以應用名作為前綴
name = 'app01_index'
name = 'app02_index'
?
偽靜態
靜態網頁:數據是寫死的 萬年不變
偽靜態網頁的設計是為了增加百度等搜索引擎seo查詢力度
所有的搜索引擎其實都是一個巨大的爬蟲程序
網站優化相關 通過偽靜態確實可以提高你的網站被查詢出來的概率
但是再怎么優化也抵不過RMB玩家
比如??https://www.cnblogs.com/Dominic-Ji/articles/10982293.html? 以.html結尾
但是數據是從數據庫中獲取的,并不是寫死的
虛擬環境
一般情況下 我們會給每一個項目 配備該項目所需要的模塊 不需要的一概不裝
虛擬環境 就類似于為每個項目量身定做的解釋器環境
如何創建虛擬環境
每創建一個虛擬環境 就類似于你又下載了一個全新的python解釋器
?
?
?
?
?
?
django版本的區別
django1.X跟django2.X版本區別
路由層1.X用的是url
而2.X用的是path
2.X中的path第一個參數不再是正則表達式,而是寫什么就匹配什么 是精準匹配
當你使用2.X不習慣的時候 2.X還有一個叫re_path
2.x中的re_path就是你1.X的url
?
雖然2.X中path不支持正則表達式? 但是它提供了五種默認的轉換器
1.0版本的url和2.0版本的re_path分組出來的數據都是字符串類型
默認有五個轉換器,感興趣的自己可以課下去試一下
str,匹配除了路徑分隔符(/)之外的非空字符串,這是默認的形式
int,匹配正整數,包含0。
slug,匹配字母、數字以及橫杠、下劃線組成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
?
path('index/<int:id>/',index)? # 會將id匹配到的內容自動轉換成整型
?
?
還支持自定義轉換器class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value 占四位,不夠用0填滿,超了則就按超了的位數來!register_converter(FourDigitYearConverter, 'yyyy') urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<yyyy:year>/', views.year_archive), ... ]Django請求生命周期
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/asdaa/p/11536190.html
總結
- 上一篇: 爱奇艺、新英体育宣布成立合资公司,共造超
- 下一篇: 一、计算机核心组成及CPU核心组成