[Python] Django框架入門3——深入視圖
說明:
本文主要深入了解視圖(views.py),涉及路由配置、定義視圖、Request對象、Response對象、狀態保持等。
一、路由配置
1、配置位置(settings.py 的 ROOT_URLCONF)
在settings.py中的ROOT_URLCONF指向的urls.py則是主要的路由配置文件。
2、修改主路由文件(test2.urls)
1 from django.conf.urls import url, include 2 from django.contrib import admin 3 4 urlpatterns = [ 5 url(r‘^admin/‘, admin.site.urls), 6 # 應用booktest的路由文件 7 url(r‘^booktest/‘, include(‘booktest.urls‘)) 8 ]
urlpatterns是一個url()實例的列表,url(正則表達式, 視圖函數, 名稱name)
編寫URLconf註意點:
如果需要從url中捕獲一個值,需要在它周圍設置一對圓括號,如:url(r‘^pro/(\d+)$‘, views.pro, name=‘pro‘),對應的請求url為[ http://127.0.0.1:8000/pro/112 ]這裏的紅色部分則為需要傳到請求的參數。
不需要添加前導的反斜杠,如應寫為 “test/”而不是寫作 “/test/”。
每個正則表達式前面的r表示字符串的不轉義。
正則表達式非命名組,通過位置參數傳遞給視圖
url( r‘^([0-9]+)/$‘, views.detail, name=‘detail‘ )
這裏的參數是按照正則匹配的順序,對應視圖的參數位置。對應的detail方法如:def detail(request, id)
正則表達式命名組,通過關鍵字參數傳遞給視圖,本例中關鍵字參數為id
url( r‘^(?P<id>[0-9]+)/$‘, views.detail, name=‘detail‘ )
通過?P<參數名>與視圖參數名一一對應。
參數匹配規則:優先使用命名參數,如果沒有命名參數則使用位置參數。
每個捕獲的參數都作為一個普通的python字符串傳遞給給視圖。
3、包含其他的URLconfs
在應用中創建urls.py文件,定義本應用中的urlconf,再在項目的 urls.py中使用include:
匹配過程:先與主URLconf匹配,成功後再用剩余的部分與應用的URLconf匹配,過程如下圖:
使用include可以去除URLconf的冗余,即已完成匹配的部分不會再下一次的匹配中使用。
在include中通過namespace定義命名空間,用於反解析。
4、URL的反解析
如果在視圖、模板中使用硬編碼的鏈接,在urlconf發生改變的時候,維護起來不是那麽容易。
解決:在做鏈接的時,通過指向urlconf的名稱,動態生成鏈接地址
視圖:使用django.core.urlresolvers.reverse()函數
模板:使用url模板標簽
二、定義視圖(視圖函數)
def detail(request, id)
視圖本質是一個函數,視圖的參數:一個HttpRequest實例,通過正則表達式獲取的位置參數;通過正則表達式組獲取的關鍵字參數。
在應用目錄下默認有views.py文件,一般視圖都定義在這個文件中。
如果處理功能過多,可以將函數定義到不同的py文件中(不推薦,推薦使用多應用,即新建應用)
三、Request對象
服務器接收http協議的請求後,會根據報文創建HttpRequest對象。
視圖函數的第一參數是HttpRequest對象。
在django.http模塊中定義了HttpRequest對象的API。
1、屬性
path:一個字符串,表示請求頁面的完整路徑,不包含域名。
method:一個字符串,表示請求使用的HTTP請求方式,常用值有GET、POST。
encoding:一個字符串,表示提交的數據的編碼方式。
如果是None則表示使用瀏覽器的默認設置,一般為utf-8
這個屬性是可寫,可以通過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問都使用新的encoding值。
GET:一個類似於字典的對象(QueryDict對象),包含get請求方式的所有參數。
POST:一個類似於字典的對象(QueryDict對象),包含post請求方式的所有參數。
FILES:一個類似於字典的對象,包含所有的上傳文件。
COOKIE:一個標準的Python字典,包含所有的cookie,鍵值都為字符串。
session:一個即可讀又可寫的類似於字典的對象,表示當前的會話,只當Django啟用會話的支持時才可用,詳見"狀態保持"。
2、方法
is_ajax():如果請求是通過XMLHttpRequest發起的,則返回True。
3、QueryDict對象
定義在django.http.QueryDict。
Request對象的屬性GET、POST都是QueryDict類型的對象。
與Python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況。
方法get():根據鍵獲取值:
只能獲取鍵的一個值。
如果一個件同時擁有多個值,獲取最後一個值。
方法getlist():根據鍵獲取值:
將鍵的值以列表返回,可以獲取一個鍵的多個值
4、GET屬性
request.GET[‘key‘]
request.GET.get(‘key‘)
request.GET.getlist(‘key‘)
5、POST屬性
request.POST[‘key‘]
request.POST.get(‘key‘)
request.POST.getlist(‘key‘)
四、Response對象
在django.http模塊中定義了HttpResponse對象的API。
HttpRequest對象由Django自動創建,HttpResponse對象由程序員創建。
不調用模板,直接返回數據。
調用模板
1、Response的成員
屬性:
context:表示返回的內容,字符串類型。
charset:表示response采用的編碼字符集,字符串類型。
status_code:響應的HTTP響應的狀態碼。
content-type:指定輸出的MIME類型。
方法:
init:使用頁內容實例化HttpResponse對象
write(contetn):以文件的方式寫。
flush():以偉健的方式輸出緩存區。
set_cookie(key, value=‘‘, nax_age=None, expires=None):設置Cookie。
key、value都是字符串類型;
max_age是一個整數,表示在指定秒數後過期
expires是一個datetime或timedelta對象,會話將在這個指定的日期/時間過期,註意datetime和timedelta值只有在使用PickleSerialize時才可序列化
max_age與expires二選一
如果不指定過期時間,則兩個星期後過期。
delete_cookie(key):刪除指定的key的Cookie,如果key不存在什麽也不發生。
2、子類HttpResponseRedirect
重定向、服務端跳轉,構造函數的第一個參數用來指定重定向的地址:
推薦使用反向解析
3、子類JsonResponse
返回json數據,一般用於異步請求。__init__(data),幫助用戶創建JSOn編碼的響應,參數data是字典對象。
JsonResponse的默認content-Type為application/json。
4、簡寫函數
渲染視圖 render
重定向
五、狀態保持
1、啟用session
使用django-admin startproject myapp 創建的項目默認啟用session
開啟只需修改settings.py文件
禁用session:刪除上面指定的兩個值,禁用會話將節省一些性能消耗。
2、使用session
啟用會話後,每個HttpRequest對象都將具有一個session屬性,它是一個類字典的對象
get(‘key‘, default=None):根據鍵獲取會話的值。
clear():清楚所有會話。
flush():刪除當前的會話數據並刪除會話的Cookie。
del request.session[‘member_id‘]:刪除會話
[Python] Django框架入門3——深入視圖