視圖的功能:
接收請求,進行處理,返回應答。
圖解

圖解剖析

視圖返回的內容為:
- HttpResponse的對象或子對象
- render 返回的是HttpResponse的對象
- JsonResponse是HttpResponse的子類
- HttpResponseRedirect也是HttpResonse的子類
- redirect是HttpResponseRedirect的一個簡寫
總結:所以視圖返回的內容一般為:render,redirect,JsonResponse,Httpresponse
定義視圖函數分為兩步
一:定義視圖
視圖函數定義在view.py中
def index(request):
pass
return HttpResponse("hello python")
注:參數中必須設置一個參數:request(request為HttpRequest的對象)需要返回一個HttpResponse的對象返回給瀏覽器顯示的內容
參數還可能有:
- 通過正則表達式組獲得的關鍵字參數。
- 通過正則表達式組獲取的位置參數。
二:配置url
配置url的過程:
- 在項目的urls文件中包含具體應用的urls文件,在具體應用的urls文件中包含具體url和視圖的對應關系。
- url配置項是定義在一個名叫urlpatterns的列表中,其中的每一個元素就是一個配置項,每一個配置項都調用url函數。
url函數的兩種語法
- url('正則表達式', include('應用的urls文件'))
- url('正則表達式',視圖函數名)。
開發時的方法:
- 1.在項目的url文件中配置
urlpatterns = [
url(r'', include("app名稱.urls"))
]
- 2.在app里面創建一個urls.py文件進行匹配
urlpatterns = [
url(r'^index$=$', 對應的匹配函數),
# 這里一般做完全匹配
]
url的匹配過程
url:http://127.0.0.1:8000/aindex/?a=3
# 項目中的urls.py
url(r'^a', include('booktest.urls')),
# 應用中的urls.py配置
url(r'^index/$', views.index),
- 去除域名和后面的參數,剩下/aindex/,再把前面的/去掉,剩下aindex/
- 拿index/先到項目的url.py文件中進行從上到下的匹配,匹配成功之后執行后面對應的處理動作,就是把匹配成功的部分a字符去除,然后拿剩下的部分index到應用的urls.py文件中再進行從上到下的匹配。
- 如果匹配成功則調用相應的視圖產生內容返回給客戶端。如果匹配失敗則產生404錯誤。
錯誤提示:
- 404:找不到頁面,關閉調試模式之后,默認會顯示一個標准的錯誤頁面,如果要顯示自定的頁面,則需要的templates目錄下面自定義一個404.html文件。
- 500: 服務器端的錯誤。
- 400:非法的客戶端請求錯誤。
如果想看到錯誤視圖而不是調試信息,需要修改test3/setting.py文件的DEBUG項。
DEBUG = False # debug關閉 ALLOWED_HOSTS = ['*', ] #表示允許所有的地址訪問
捕獲url參數:
進行url匹配時,把所需要的捕獲的部分設置成一個正則表達式組,這樣django框架就會自動把匹配成功后相應組的內容作為參數傳遞給視圖函數。
1)位置參數
位置參數,參數名可以隨意指定
url(r'^delete_(\d)/$', views.show_add_cookie),
2)關鍵字參數:在位置參數的基礎上給正則表達式組命名即可。
?P<組名>
注:關鍵字參數,視圖參數名必須和正則表達式組名一致.
url(r'^(delete(?P<bid>\d+))/$', views.show_arg),
注意:兩種參數的方式不要混合使用,在一個正則表達式中只能使用一種參數方式。
HttpRequest對象
服務器收到http協議請求后會根據請求信息創建HttpRequest對象,這個對象不需要我們創建,視圖的第一個參數必須是HttpRequest的對象
屬性:
- path:一個字符串,表示請求的頁面的完整路徑,不包含域名。
- method:一個字符串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。
- 在瀏覽器中給出地址發出請求采用get方式,如超鏈接。
- 在瀏覽器中點擊表單的提交按鈕發起請求,如果表單的method設置為post則為post請求。
- encoding:一個字符串,表示提交的數據的編碼方式。
- 如果為None則表示使用瀏覽器的默認設置,一般為utf-8。
- 這個屬性是可寫的,可以通過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
- GET:一個類似於字典的對象,包含get請求方式的所有參數。
- POST:一個類似於字典的對象,包含post請求方式的所有參數。
- FILES:一個類似於字典的對象,包含所有的上傳文件。
- COOKIES:一個標准的Python字典,包含所有的cookie,鍵和值都為字符串。
- session:一個既可讀又可寫的類似於字典的對象,表示當前的會話,只有當Django 啟用會話的支持時才可用,詳細內容見"狀態保持"。
GET屬性:
請求格式:在請求地址結尾使用?,之后以“鍵=值”的格式拼接,多個鍵值對之間以&連接。
例:網址如下
http://www.itcast.cn/?a=10&b=20&c=python
其中的請求參數為:
a=10&b=20&c=python
總結:
- 分析請求參數,鍵為'a'、'b'、'c',值為'10'、'20'、'python'。
- 在Django中可以使用HttpRequest對象的GET屬性獲得get方方式請求的參數。
- GET屬性返回QueryDict類型的對象,鍵和值都是字符串類型。
- 鍵是開發人員在編寫代碼時確定下來的。
- 值是根據數據生成的。
PSOT屬性:
使用form表單請求時,method方式為post則會發起post方式的請求,需要使用HttpRequest對象的POST屬性接收參數,POST屬性返回QueryDict類型的對象。
提交參數的方式:
- 控件name屬性的值作為鍵,value屬性的值為值,構成鍵值對提交。
總結:
- 如果控件沒有name屬性則不提交。
- 對於checkbox控件,name屬性的值相同為一組,被選中的項會被提交,出現一鍵多值的情況。
- 鍵是控件name屬性的值,是由開發人員編寫的。
- 值是用戶填寫或選擇的。
- post提交的值在瀏覽器的請求體當中可以看到
QueryDict對象:
HttpRequest對象的屬性GET、POST都是QueryDict類型的對象與python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況
方法get():
根據鍵獲取值如果一個鍵同時擁有多個值將獲取最后一個值
如果鍵不存在則返回None值,可以設置默認值進行后續處理
示例:
dict.get('鍵',默認值)
可簡寫為
dict['鍵']
方法getlist():
根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
如果鍵不存在則返回空列表[],可以設置默認值進行后續處理
示例:
dict.getlist('鍵',默認值)
HttpResPonse對象
屬性
- content:表示返回的內容。
- charset:表示response采用的編碼字符集,默認為utf-8。
- status_code:返回的HTTP響應狀態碼。
- content-type:指定返回數據的的MIME類型,默認為'text/html'。
方法
- init:創建HttpResponse對象后完成返回內容的初始化。
- set_cookie:設置Cookie信息。
- write:向響應體中寫數據。
- cookie是網站以鍵值對格式存儲在瀏覽器中的一段純文本信息,用於實現用戶跟蹤。
- max_age是一個整數,表示在指定秒數后過期。
- expires是一個datetime或timedelta對象,會話將在這個指定的日期/時間過期。
- max_age與expires二選一。
- 如果不指定過期時間,在關閉瀏覽器時cookie會過期。
set_cookie(key, value='', max_age=None, expires=None)
- delete_cookie(key):刪除指定的key的Cookie,如果key不存在則什么也不發生。
子類JsonResponse
在瀏覽器中使用javascript發起ajax請求時,返回json格式的數據,類JsonResponse繼承自HttpResponse對象,被定義在django.http模塊中,創建對象時接收字典作為參數。
JsonResponse對象的content-type為'application/json'。
示例
def get_data_by_ajax(request):
"""等待兩秒發送請求"""
time.sleep(2)
return JsonResponse({"res": 1})
子類HttpResponseRedirect
當一個邏輯處理完成后,不需要向客戶端呈現數據,而是轉回到其它頁面,如添加成功、修改成功、刪除成功后顯示數據列表,而數據的列表視圖已經開發完成,此時不需要重新編寫列表的代碼,而是轉到這個視圖就可以,此時就需要模擬一個用戶請求的效果,從一個視圖轉到另外一個視圖,就稱為重定向。
- Django中提供了HttpResponseRedirect對象實現重定向功能,這個類繼承自HttpResponse,被定義在django.http模塊中,
- 返回的狀態碼為302。
- 重定向簡寫函數redirect
- 頁面重定向:服務器不返回頁面,而是告訴瀏覽器再去請求其他的url。
示例
def demo_redirect(request):
"""頁面重定向"""
return redirect('/index/')
查詢集對象序列化
返回Json數據時需要將查詢集進行序列化的操作
導入:
from django.core import serializers
使用serializers里面的方法
# 對查詢集進行序列化
books = serializers.serialize('json', books) # "參數一 序列化的類型 參數二序列化的參數
# 將得到的值返回
JsonResponse({'books': books})
# 傳到模板文件當中是一個字符串 轉成json對象
books = $.parseJSON(data.books)
# books為一個數組每個數組的每個元素為一個json對象
def get_book(request): """獲取圖書信息的視圖""" books = BookInfo.objects.all() # 對查詢集進行序列化 books = serializers.serialize('json', books) return JsonResponse({"books": books})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
<script>
$(function () {
$.get('/get_book1/',function (data) {
//將字符串轉成json對象
books = $.parseJSON(data.books)
content = ''
//遍歷其中的個對象獲取屬性值
content += '<tr>'
$.each(books[0].fields, function (key, val) {
content += '<td>'+key+'</td>'
})
content += '</tr>'
//便利打印出每個每個對象
$.each(books, function (index, data) {
content += '<tr>'
//遍歷打印每個里面的對象fields的值
$.each(data.fields, function (key, val) {
content += '<td>'+val+'</td>'
})
content += '</tr>'
})
$('#tab').append(content)
})
})
</script>
</head>
<body>
<table id="tab"></table>
</body>
</html>
