? 視圖接受Web 請(qǐng)求并且返回 Web 響應(yīng)
? 視圖就是一個(gè)python 函數(shù),被定義在 views.py 中
? 響應(yīng)可以是一張網(wǎng)頁的 HTML 內(nèi)容岛蚤,一個(gè)重定向,一個(gè) 404 錯(cuò)誤等等
URLconf
? 在Django框架中坪郭,提供了非常清晰簡(jiǎn)潔的url管理方法
? 在項(xiàng)目文件夾下settings.py 文件中通過ROOT_URLCONF 指定根級(jí) url 的配置
? 新建一個(gè)Django project之后吭产,在項(xiàng)目文件夾urls.py中的urlpatterns列表中來配置 url侣监,
每一個(gè)列表項(xiàng)就是一個(gè)由url函數(shù)的調(diào)用。
? urlpatterns 是一個(gè) url 實(shí)例的列表
? django 的 url 配置有效的降低了后臺(tái)和頁面的耦合度
url()方法
? def url(regex, view, kwargs=None, name=None)
o regex :正則表達(dá)式
o view:視圖函數(shù)
o name: 名稱
o name 用來唯一區(qū)分一個(gè)視圖對(duì)應(yīng)多個(gè) urlconf 的場(chǎng)景
o kwargs: 就是一個(gè)字典類型的參數(shù)
o url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"),
o 視圖函數(shù)中使用:
def index(reqeust):
booklist = BookInfo.books.all()
return render(reqeust, 'booktest/index.html', {'req':reqeust,'booklist': booklist})
功能:凡是與regex 匹配的 URL 請(qǐng)求都會(huì)執(zhí)行到 url()函數(shù)中對(duì)應(yīng)的第二個(gè)參數(shù) view 代
表的視圖函數(shù)臣淤。
? 模板鏈接中使用
<a href="detail/{{book.id}}/">{{ book.btitle }}</a>
<a href=" {{book.id}}/">{{ book.btitle }}</a>
? 編寫URLconf 的注意:
o 不需要添加一個(gè)前導(dǎo)的反斜杠橄霉,如應(yīng)該寫作'booktest/',而不應(yīng)該寫作'/booktest/'邑蒋,否
則意味著從根目錄匹配
o 表單action 的 url 除外姓蜂,要有前導(dǎo)的反斜杠
o 每個(gè)正則表達(dá)式前面的 r 表示字符串不轉(zhuǎn)義
? 請(qǐng)求的url 被看做是一個(gè)普通的 python 字符串,進(jìn)行匹配時(shí)不包括 get 或 post 請(qǐng)求的
參數(shù)及域名
http://www.qikuedu.com/python/1/?i=1&p=new医吊,只匹配“python/1/”部分
? 性能:urlpatterns 中的每個(gè)正則表達(dá)式在第一次訪問它們時(shí)被編譯钱慢,這使得系統(tǒng)相當(dāng)快
?
包含其它的URLconfs
include方法
假設(shè)我們?cè)赽ooktest 模塊中定義了一個(gè) index 頁面,想通過
"http://localhost:8000/booktest/index"來訪問
- 首先我們?cè)?view.py 中定義index 函數(shù):
def index(reqeust):
booklist = BookInfo.books.all()
return render(reqeust, 'booktest/index.html', {'booklist': booklist}) - 然后在應(yīng)用的 urls.py 的 urlpatterns 列表中添加一個(gè) url 配置:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/$', views.index),
]
然后運(yùn)行:通過"http://localhost:8000/booktest/index"來訪問
新的問題:但假如一個(gè) project 中有多個(gè) app卿堂,用以上的方式來管理 url 可能會(huì)造成比較
混亂的局面
為了解決這個(gè)問題束莫,我們可以用 include 的方法來配置 url
include(arg, namespace=None)
參數(shù)1:包含booktest 應(yīng)用的urlconf
參數(shù)2:定義命名空間懒棉,用于反解析
? 命名空間(英語:Namespace)是表示標(biāo)識(shí)符的可見范圍。
? 一個(gè)標(biāo)識(shí)符可在多個(gè)命名空間中定義览绿,它在不同命名空間中的含義是互不相干的策严。
? 這樣,在一個(gè)新的命名空間中可定義任何標(biāo)識(shí)符挟裂,它們不會(huì)與任何已有的標(biāo)識(shí)符發(fā)生沖突享钞,
因?yàn)橐延械亩x都處于其它命名空間中揍诽。
多個(gè)urlconf的使用
在應(yīng)用中創(chuàng)建 urls.py 文件诀蓉,定義本應(yīng)用中的 urlconf
再在項(xiàng)目的url.py 中使用 include() 包含應(yīng)用 app 的 urlconf
from django.conf.urls import include, url
urlpatterns = [
url(r'^', include('booktest.urls', namespace='booktest')),# 包含booktest 應(yīng)用的
urlconf
]
? 匹配過程:先與主 URLconf 匹配,成功后再用剩余的部分與應(yīng)用中的 URLconf 匹配
請(qǐng)求http://127.0.0.1:8000/booktest/1/
在項(xiàng)目urls.py中的配置:
url(r'^booktest/', include('booktest.urls', namespace='booktest')),
url(r'^([0-9]+)/$', views.detail, name='detail'),
匹配部分是:1/
匹配過程:用“1/”與 booktest 應(yīng)用的urls 匹配
? 使用include 可以去除 urlconf 的冗余
視圖參數(shù)的傳遞
? 正則表達(dá)式非命名分組暑脆,通過位置參數(shù)傳遞給視圖
url(r'^([0-9]+)/$', views.detail, name='detail'),
? 正則表達(dá)式命名分組渠啤,通過關(guān)鍵字參數(shù)傳遞給視圖,本例中關(guān)鍵字參數(shù)為 id
url(r'^(?P<id>[0-9]+)/$', views.detail, name='detail'),
? 參數(shù)匹配規(guī)則:優(yōu)先使用命名參數(shù)添吗,如果沒有命名參數(shù)則使用位置參數(shù)
? 每個(gè)捕獲的參數(shù)都作為一個(gè)普通的 python 字符串傳遞給視圖
? 若要從url 中捕獲一個(gè)值沥曹,需要在它周圍設(shè)置一對(duì)圓括號(hào)
? 參數(shù):視圖會(huì)收到來自父 URLconf、當(dāng)前URLconf 捕獲的所有參數(shù)
URL的反向解析
? 問題:如果在視圖碟联、模板中使用硬編碼的鏈接妓美,在 urlconf 發(fā)生改變時(shí),維護(hù)非常麻煩
? 解決:通過指向urlconf 的名稱鲤孵,根據(jù)正則表達(dá)式動(dòng)態(tài)生成鏈接地址
? 視圖:使用django.urls.reverse()函數(shù)
from django.urls import reverse
from django.http import HttpResponseRedirect
def test(reqeust, id):
url name 的使用:
return HttpResponseRedirect(reverse('booktest:detail', args=(1,)))
說明:
第一個(gè)參數(shù):" bookTest: detail": ' booktest應(yīng)用下的 name = detail 的函數(shù)壶栋。
booktest應(yīng)用url conf:
url(r'^booktest/detail/([0-9]+)/$',views.detail,name='detail')
第二個(gè)參數(shù):self.pk會(huì)替代正則表達(dá)式里面的pk
然后 reverse 函數(shù)去解析視圖函數(shù)對(duì)應(yīng)的URL。
? 項(xiàng)目的 url conf:url(r'^', include('booktest.urls', namespace='booktest'))
o 在模版中使用:
o django2.x:
o <a href="{% url 'booktest:detail' book.id %}">{{ book.btitle }}</a>
o django 早期版本:
? <a href="{% url 'booktest.views.detail' book.id %}">{{ book.btitle }}</a>
o 否則報(bào)錯(cuò):
o NoReverseMatch at /booktest/
o Reverse for 'detail 2' not found. 'detail 2' is not a valid view function or
pattern name.
? 在 booktest 應(yīng)用urls.py 中的配置
? app_name='app_name'