Django的生命周期

Django的生命周期

image.png

一. Django HTTP請求流程圖

Django HTTP請求流程圖

HTTP請求流程

二. 中間件

什么是中間件

中間件是一個用來處理Django的請求和響應(yīng)的框架級別的鉤子。它是一個輕量、低級別的插件系統(tǒng),用于在全局范圍內(nèi)改變Django的輸入和輸出。每個中間件組件負責(zé)做一些特定的功能。

中間件的五種方法

process_request

  • 執(zhí)行時間:在視圖函數(shù)之前,在路由匹配之前
  • 參數(shù):
    request:請求對象,與視圖中用到的request參數(shù)是同一個對象
  • 返回值:
    None:按照正常的流程走
    HttpResponse:接著倒序執(zhí)行當前中間件的以及之前執(zhí)行過的中間件的process_response方法,不再執(zhí)行其它的所有方法
  • 執(zhí)行順序:按照MIDDLEWARE中的注冊的順序執(zhí)行,也就是此列表的索引值

process_response

  • 執(zhí)行時間:最后執(zhí)行
  • 參數(shù):
    request:請求對象,與視圖中用到的request參數(shù)是同一個對象
    response:響應(yīng)對象,與視圖中返回的response是同一個對象
  • 返回值:
    response:必須返回此對象,按照正常的流程走
  • 執(zhí)行順序:按照注冊的順序倒序執(zhí)行

process_view

  • 執(zhí)行時間:在process_request方法及路由匹配之后,視圖之前
  • 參數(shù):
    request:請求對象,與視圖中用到的request參數(shù)是同一個對象
    view_func:將要執(zhí)行的視圖函數(shù)(它是實際的函數(shù)對象,而不是函數(shù)的名稱作為字符串)
    view_args:url路徑中將傳遞給視圖的位置參數(shù)的元組
    view_kwargs:url路徑中將傳遞給視圖的關(guān)鍵值參數(shù)的字典
  • 返回值:
    None:按照正常的流程走
    HttpResponse:它之后的中間件的process_view,及視圖不執(zhí)行,執(zhí)行所有中間件的process_response方法
  • 執(zhí)行順序:按照注冊的順序執(zhí)行

process_template_response
此方法必須在視圖函數(shù)返回的對象有一個render()方法(或者表明該對象是一個TemplateResponse對象或等價方法)時,才被執(zhí)行

  • 執(zhí)行時間:視圖之后,process_exception之前
  • 參數(shù):
    request:請求對象,與視圖中用到的request參數(shù)是同一個對象
    response:是TemplateResponse對象(由視圖函數(shù)或者中間件產(chǎn)生)
  • 返回值:
    response:必須返回此對象,按照正常的流程走
  • 執(zhí)行順序:按照注冊的順序倒序執(zhí)行

process_exception
此方法只在視圖中觸發(fā)異常時才被執(zhí)行.

  • 執(zhí)行時間:視圖之后,process_response之前
  • 參數(shù):
    request:請求對象,與視圖中用到的request參數(shù)是同一個對象
    exception:視圖函數(shù)異常產(chǎn)生的Exception對象
  • 返回值:
    None:按照正常的流程走
    HttpResponse對象:不再執(zhí)行后面的process_exception方法
  • 執(zhí)行順序:按照注冊的順序倒序執(zhí)行
中間件的執(zhí)行流程
中間件的執(zhí)行流程
中間件的執(zhí)行順序
中間件的執(zhí)行順序

三. 認證系統(tǒng)

創(chuàng)建用戶
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
修改密碼
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
認證過程

判斷認證函數(shù):is_authenticated()

認證一個給定用戶名和密碼函數(shù):authenticate()

登入一個用戶函數(shù):login()

from django.contrib.auth import authenticate, login

def my_view(request):
    user = authenticate(username=request.POST['username'], password=request.POST['password'])
    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
            ...
    else:
        # Return an 'invalid login' error message.
        ...
login_required 裝飾器
from django.contrib.auth.decorators import login_required

@login_required(redirect_field_name='my_redirect_field')
    def my_view(request):
登陸訪問限制
from django.contrib.auth.decorators import user_passes_test

def email_check(user):
    return user.email.endswith('@example.com')
    
@user_passes_test(email_check)
    def my_view(request):
...
SessionAuthenticationMiddleware 
update_session_auth_hash

#### 三. 路由系統(tǒng)
##### 什么是路由
本質(zhì)是URL與要為該URL調(diào)用的視圖函數(shù)之間的映射表。
##### 基本格式
```python
from django.conf.urls import url

urlpatterns = [
     url(正則表達式, views視圖函數(shù),參數(shù),別名),
]

四. 視圖

什么是視圖

本質(zhì)是一個函數(shù)

  • 必須有一個HttpRequest實例(request)
  • 通過正則表達式組獲取位置參數(shù)
  • 通過正則表達式組獲取關(guān)鍵字參數(shù)
Request對象

服務(wù)器接收到http協(xié)議的請求后,會根據(jù)報文創(chuàng)建HttpRequest對象

  1. 屬性和方法

屬性
path:一個字符串,表示請求的頁面的完整路徑,不包含域名
method:一個字符串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'
GET:一個類似于字典的對象,包含get請求方式的所有參數(shù)
POST:一個類似于字典的對象,包含post請求方式的所有參數(shù)
FILES:一個類似于字典的對象,包含所有的上傳文件
COOKIES:一個標準的Python字典,包含所有的cookie,鍵和值都為字符串
session:一個既可讀又可寫的類似于字典的對象,表示當前的會話,只有當Django 啟用會話的支持時才可用,詳細內(nèi)容見“狀態(tài)保持”
方法:
is_ajax():如果請求是通過XMLHttpRequest發(fā)起的,則返回True

  1. QueryDict對象

request對象的屬性GET、POST都是QueryDict類型的對象

  • get():根據(jù)鍵獲取值,只能獲取鍵的一個值,如果一個鍵同時擁有多個值,獲取最后一個值
  • getlist():根據(jù)鍵獲取值,將鍵的值以列表返回,可以獲取一個鍵的多個值
Respone對象

屬性:
content:表示返回的內(nèi)容,字符串類型
charset:表示response采用的編碼字符集,字符串類型

status_code:響應(yīng)的HTTP響應(yīng)狀態(tài)碼
content-type:指定輸出的MIME類型
方法:
init :使用頁內(nèi)容實例化HttpResponse對象
write(content):以文件的方式寫
flush():以文件的方式輸出緩存區(qū)
set_cookie(key, value='', max_age=None, expires=None):設(shè)置Cookie
key、value都是字符串類型
max_age是一個整數(shù),表示在指定秒數(shù)后過期
expires是一個datetime或timedelta對象,會話將在這個指定的日期/時間過期,注意datetime和timedelta值只有在使用PickleSerializer時才可序列化
max_age與expires二選一
如果不指定過期時間,則兩個星期后過期
delete_cookie(key):刪除指定的key的Cookie,如果key不存在則什么也不發(fā)生

狀態(tài)保持

Session

會話過期時間
set_expiry(value):設(shè)置會話的超時時間
如果沒有指定,則兩個星期后過期
如果value是一個整數(shù),會話將在values秒沒有活動后過期
若果value是一個imedelta對象,會話將在當前時間加上這個指定的日期/時間過期
如果value為0,那么用戶會話的Cookie將在用戶的瀏覽器關(guān)閉時過期
如果value為None,那么會話永不過期

五. 緩存

緩存就是為了減少數(shù)據(jù)庫IO,不重復(fù)消耗計算資源,Django擁有一套健壯的緩存系統(tǒng)來保存動態(tài)頁面,避免每次請求都重新計算,Django提供了特定視圖的輸出、可以僅僅緩存那些很難生產(chǎn)出來的部分、或者可以緩存整個網(wǎng)站

設(shè)置緩存
  • Django數(shù)據(jù)緩可以存在數(shù)據(jù)庫中、文件系統(tǒng)或者內(nèi)存中
  • 通過setting文件的CACHES配置來實現(xiàn)
  • 參數(shù)TIMEOUT:緩存過期時間,以秒為單位,默認300秒;設(shè)置None表示永遠不過期,設(shè)置成0表示緩存立即失效
緩存settings.py
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
        'TIMEOUT': 60,
    }
}
虛擬緩存
CACHES = {
        'default': {
                'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        }
}
站點級緩存

緩存整個網(wǎng)站

單個view緩存
from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
    ...
路由指定視圖緩存
from django.views.decorators.cache import cache_page

urlpatterns = [
url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
]
底層的緩存API
>>> cache.set('add_key', 'Initial value', 30)
>>> cache.add('add_key', 'New value')
>>> cache.get('add_key')
'Initial value'
>>> cache.set('a', 1)
>>> cache.set('b', 2)
>>> cache.get_many(['a', 'b'])
{'a': 1, 'b': 2}
>>> cache.delete_many(['a', 'b'])
>>> cache.incr('a')
>>> cache.decr('a')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容