1. 程式人生 > >[Python] Django框架入門3——深入視圖

[Python] Django框架入門3——深入視圖

.py request對象 att bubuko 情況 ron url ros microsoft

說明:

  本文主要深入了解視圖(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——深入視圖