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

來源:互聯網
上載者:User

標籤: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‘,視圖函數名)。
開發時的方法:
  • 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.pyurl(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匹配時,把所需要的捕獲的部分設定成一個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對象,對象序列化接受及案例]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.