Django中視圖總結[urls匹配,HttpRequest對象,HttpResponse對象,對象序列化接受及案例]


視圖的功能:

接收請求,進行處理,返回應答。

圖解

圖解剖析

 

 

視圖返回的內容為:

  • 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),
  1. 去除域名和后面的參數,剩下/aindex/,再把前面的/去掉,剩下aindex/
  2. 拿index/先到項目的url.py文件中進行從上到下的匹配,匹配成功之后執行后面對應的處理動作,就是把匹配成功的部分a字符去除,然后拿剩下的部分index到應用的urls.py文件中再進行從上到下的匹配。
  3. 如果匹配成功則調用相應的視圖產生內容返回給客戶端。如果匹配失敗則產生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})
視圖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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM