路由控制
1、簡單路由配置
url(r'^booklist$', views.booklist)
- 第一個參數是正則表達式,第二個參數是視圖函數
- 每一個正則表達式前面的'r' 是可選的可是建議加上。它告訴Python 這個字符串是「原始的」 —— 字符串中任何字符都不該該轉義
url(r'booklist', views.booklist) url(r'booklistadd', views.booklistadd)
若是不加^ 和 $ ,因爲路由匹配是從上往下匹配的,如果要匹配 booklistadd ,則極可能會匹配到booklist就會中止匹配html
2、無名分組
url(r'^booklist/([0-9]{4})/([0-9]{2})/$', views.booklist) def booklist(request, a, b) 或者 def booklist(request, *args)
- 按位置傳參
- () 表示分組,分組後,會把分組出來的數據當作位置參數,傳遞到視圖函數
- 視圖函數中必需要有位置參數接收分組出來的數據。因爲分組出來的數據可能有不少,因此也能夠用 *args 來用一個元組接收全部數據。
3、有名分組
url(r'^booklist/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.booklist) def booklist(request, year, month)
- 按關鍵字傳參
- 分組後,會把分組出來的數據按關鍵字傳參,傳遞到視圖函數
- 視圖函數須要定義形參來接收,而且視圖函數中形參的名字要跟分組的名字同樣,與順序無關
4、反向解析
一、什麼是反向解析
在Django中,常常須要獲取某條URL,爲生成的內容配置URL連接。python
urlpatterns =[ url ( r'^booklist$', views.booklist ) , ]正則表達式
如在a標籤中,<a href='/booklist/'>,假若url發生了變化,就必需要去html中手動修改a的href,這樣會浪費大量的工做時間。所以,Django提供一種方案,在url中提供一個name參數,至關因而給url取了一個名字。django
url(r'^booklist$', views.booklist,name='book_url')
二、使用反向解析獲取url
(1)三種url
# 1.無參 url(r'^booklist$', views.booklist,name='book_url') # 2.有參,無名分組 url(r'^userlist/([0-9]{4})/([0-9]{2})/$',views.userlist,name='user_url') # 3.有參,有名分組 url(r'^manlist/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.manlist,name='man_url')
(2)模板層
# 1.無參 <form action="{{% url 'book_url' %}}"> # 2.有參,無名分組, 2008 和 12 表示兩個參數,即兩個分組 {{% url 'user_url' 2008 12 %}} # 3.有參,有名分組 {{% url 'man_url' 2018 12 %}} 或者 {{% url 'man_url' year=2018 month=12 %}}
(3)視圖層
from django.conf.urls import redirect,reverse # 1.無參 url=reverse('book_url') return redirect(url) # 2.有參,無名分組, 2008 和 12 表示兩個參數,即兩個分組 url=reverse('user_url',args=(2018,12,)) # 3.有參,有名分組 url=reverse('man_url',args=(2018,12,)) 或者 url=reverse('man_url',kwargs={'year':2018,'mounth':12})
5、路由分發
一、在不一樣的app中建立子路由urls.pymarkdown
二、在總路由中配置app
from django.conf.urls import include url(r'^app01/',include('app01.urls')) url(r'^blog/',include('blog.urls'))
三、在不一樣app的urls中配置路由函數
# 在app01中,urls.py url(r'booklist$',views.booklist) # 在blog中,urls.py url(r'userlist$',views.userlist)
6、名稱空間(通常不使用)
一、什麼是名稱空間
命名空間(英語:Namespace)是表示標識符的可見範圍。一個標識符可在多個命名空間中定義,它在不一樣命名空間中的含義是互不相干的。post
# 總路由 url(r'^app01/',include('app01.urls',namespace='app01')) url(r'^blog/',include('blog.urls',namespace='blog'))
# 子路由 # app01中 url(r'^publish/$', views.publish,name='test') # blog中 url(r'userlist$',views.userlist,name='test')
二、使用名稱空間
名稱空間 : 路由別名學習
視圖層:url = reverse('blog:test') 模板層:{% url 'app01:test'%}
7、僞靜態
爲了更好的被搜索引擎收錄而經過必定的規則,把動態頁面的地址轉換成以htm或html結尾的地址,看起來是靜態的,實際是依然是動態頁面。網站
例如訪問http://127.0.0.1:8000/book/4.html,它看上去是靜態網站,可是其實其中的數據是經過後臺獲取實時更新的。
# 路由,用html結尾 url(r'^book/(?P<id>\d+.html)',views.book),
8、Django 2.x和Django 1.x 路由層區別
一、Django2.x中
- re_path:跟1.0的url用法相同
- path:傳的路徑,是準確路徑
urlpatterns = [path('test/',view.test), ]
二、轉換器
5個轉換器
path('test/<path:year>', views.re_test) # year 表示名字,path表示year是path類型的
str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式
int,匹配正整數,包含0。 slug,匹配字母、數字以及橫槓、下劃線組成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
三、自定義轉換器
# 1 定義一個類: class MyCon: # 寫一個正則表達式 regex = '[0-9]{4}' # 匹配出來的數據,會傳到這裏,retrun回去的,會被視圖函數接收 def to_python(self, value): return int(value) # 反向解析用的 def to_url(self, value): return '%04d' % value # 2.註冊轉換器 from django.urls import register_converter register_converter(MyCon,'yyy') # 3.使用自定義轉換器 path('test/<yyy:year>', views.re_test,name='test'),
9、APPEND_SLASH
# 是否開啓URL訪問地址後面不爲/跳轉至帶有/的路徑的配置項 APPEND_SLASH=True
-
Django settings.py配置文件中默認沒有 APPEND_SLASH 這個參數,但 Django 默認這個參數爲 APPEND_SLASH = True。 其做用就是自動在網址結尾加'/'
-
默認APPEND_SLASH = True,即會自動在網址末尾加上 ‘/’
如訪問 https://www.cnblogs.com 時,默認會加上 ‘/’,至關於方位了 https://www.cnblogs.com/
若是設置了APPEND_SLASH = False,訪問 https://www.cnblogs.com 就不會加’/‘,就找不到頁面