目錄
一、視圖的介紹
二、使用視圖
1.定義視圖
2.配置URLconf
3.測試請求
三、url、path、re_path三者的區別
1.url
2.path
3.re_path
四、路由命名與reverse反解析
1 路由命名
2 reverse反解析
應用
中views.py
文件中的函數HttpRequest對象
,還可能包含下參數如 HttpResponse對象
或子對象
作為響應 JsonResponse
HttpResponseRedirect
HttpRequest
,進行邏輯處理,返回Web響應HttpResponse
給請求者 HTML內容
,404錯誤
,重定向
,json數據
...視圖的處理過程:
使用視圖時需要進行兩步操作,兩步操作不分先後
應用/views.py
中定義視圖應用
的views.py中.請求信息
.對象
,包含返回給請求者的響應信息
.需要導入HttpResponse
模塊 :
from django.http import HttpResponse
定義視圖函數 : 響應字符串‘這是我的第一個視圖’
給客戶端
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('這是我的第一個視圖!')
打開views.py輸入上述代碼
查找視圖的過程 :
1.請求者在浏覽器地址欄中輸入URL, 請求到網站.
2.網站獲取URL信息.
3.然後與編寫好的URLconf逐條匹配.
4.如果匹配成功則調用對應的視圖.
5.如果所有的URLconf都沒有匹配成功.則返回404錯誤.
URLconf入口
ROOT_URLCONF = 'bookmanager.urls'——>是默認的的URLconf入口
URLconf入口可以根據自己的需求修改,但一般都默認使用
完成URLconf配置分為兩步:
1.在應用
中定義URLconf
首先,在應用目錄中新建一個urls.py文件,在文件中導入相關的模塊代碼如下:
from django.urls import path
from book.views import index
urlpatterns = [
path('', index)
]
2.在項目
中定義URLconf
打開項目中的urls.py,文件已有admin的url,所有我們可以直接訪問到站點管理
在【urlpatterns】列表中我們可以定義添加我們的URLconf,在注釋中,有提供我們如何添加url的參考例子,添加後的代碼如下:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', include('book.urls'))
]
當我們完成了配置URLconf的步驟後,我們就能通過運行代碼來,訪問我們的視圖。
運行代碼:
打開我們的網址
在搜索框中輸入127.0.0.0:8000/index/,就能看到我們設置的視圖
初學者一般不能分清兩者的區別,所這簡單介紹下兩者.首先,url是Django 1.x中的寫法,p在Django2.1中,開始捨棄django1.x中的url寫法。
在django2.x中,描寫url配置的有兩個函數path和re_path.re_path()函數可以看做是django 1.x中得url函數,即可以在路徑中使用正則.
在settings.py文件中有一個ROOT_URLCONF設置,設置的是在訪問網址時通過哪一個url文件去匹配所請求的網址
url參數
url或者re_path要復雜一些 (r'^blog/(?P[0-9]{4})/′)首先需要開始符和結尾符 ') 首先需要開始符^和結尾符 ′)首先需要開始符和結尾符,參數匹配一個 ()就是一個匹配參數,
(?P<匹配的字段名>正則表達式)
進行匹配是不包括get或者post請求方式的參數及域名比如www.qq.com/blog?num=1並不會匹配?後邊的字符
可以給request參數設置一個默認值,最常見的分頁url,比如
urlpatterns=[
url(r'^page/$',views.page),
url(r'^page(?P<num>[0-9]+)$',views.page)
]
#views
def page(request,num='1'):
pass
自定義錯誤頁面關鍵字handler400=blog.views.page_no_find
#urls.py
…
handler400=blog.views.page_no_find
參數的使用方法path(‘blog/str:string/') 簡單了很多,就是尖括號,前邊是str代表參數的類型,後面代表參數的名稱
path參數類型
捕獲url中的參數需要用到尖括號<> 指定尖括號中的值類型比如int:astr:link這個轉換器還有許多類型比如:
int 匹配0和正整數
str 匹配任何空字符串但不包括/
slug 可理解為注釋 匹配任何ascii碼包括連接線和下劃線
uuid 匹配一個uuid對象(該對象必須包括破折號—,所有字母必須小寫)
path 匹配所有的字符串 包括/(意思就是path前邊和後邊的所有)
如果遇上路徑和轉換器語法都不足以定義的URL模式,那麼就需要使用正則表達式,這時候就需要使用re_path(),而非path()。
舉例:傳遞 數字結尾的參數
re_path(r'(\d+)/$',views.peopleList,name='peopleList'),
在定義路由的時候,可以為路由命名,方便查找特定視圖的具體路徑信息。
1) 在使用include函數定義路由時,可以使用namespace參數定義路由的命名空間,如
url(r'^',include('book.urls',namespace='book'))
命名空間表示,凡是book.urls中定義的路由,均屬於namespace指明的book名下。
命名空間的作用:避免不同應用中的路由使用了相同的名字發生沖突,使用命名空間區別開。
2) 在定義普通路由時,可以使用name參數指明路由的名字,如
urlpatterns = [
url(r'^$',index),
# 匹配書籍列表信息的URL,調用對應的bookList視圖
url(r'^booklist/$',bookList,name='index'),
url(r'^testproject/$',views.testproject,name='test'),
]
使用reverse函數,可以根據路由名稱,返回具體的路徑,如:
from django.core.urlresolvers import reverse
#或者
from django.urls import reverse
def testproject(request):
return HttpResponse("OK")
# 定義視圖:提供書籍列表信息
def bookList(request):
url = reverse('book:test')
print(url)
return HttpResponse('index')