標籤:ssi 找不到 url info 匹配 dict index 點擊 頁面
視圖的功能:
接收請求,進行處理,返回應答。
視圖返回的內容為:
- HttpResponse的對象或子物件
- render 返回的是HttpResponse的對象
- JsonResponse是HttpResponse的子類
- HttpResponseRedirect也是HttpResonse的子類
- redirect是HttpResponseRedirect的一個簡寫
總結:所以視圖返回的內容一般為:render,redirect,JsonResponse,Httpresponse
定義視圖函數分為兩步一:定義視圖
視圖函數定義在view.py中
def index(request):passreturn HttpResponse("hello python")
註:參數中必須設定一個參數:request(request為HttpRequest的對象)需要返回一個HttpResponse的對象返回給瀏覽器顯示的內容
參數還可能有:
- 通過Regex組獲得的關鍵字參數。
- 通過Regex組擷取的位置參數。
二:配置url配置url的過程:
- 在項目的urls檔案中包含具體應用的urls檔案,在具體應用的urls檔案中包含具體url和視圖的對應關係。
- url配置項是定義在一個名叫urlpatterns的列表中,其中的每一個元素就是一個配置項,每一個配置項都調用url函數。
url函數的兩種文法
- url(‘Regex‘, include(‘應用的urls檔案‘))
- url(‘Regex‘,視圖函數名)。
開發時的方法:
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.pyurl(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匹配時,把所需要的捕獲的部分設定成一個Regex組,這樣django架構就會自動把匹配成功後相應組的內容作為參數傳遞給視圖函數。
1)位置參數
位置參數,參數名可以隨意指定
url(r‘^delete_(\d)/$‘, views.show_add_cookie),
2)關鍵字參數:在位置參數的基礎上給Regex組命名即可。
?P<組名>
註:關鍵字參數,視圖參數名必須和Regex組名一致.
url(r‘^(delete(?P<bid>\d+))/$‘, views.show_arg),
注意:兩種參數的方式不要混合使用,在一個Regex中只能使用一種參數方式。
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})
視圖Code
<!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>
模板code
Django中視圖總結[urls匹配,HttpRequest對象,HttpResponse對象,對象序列化接受及案例]