python-Django基本流程原理01

yiyumo發表於2020-10-14

Python-Django基本流程原理

python之django框架的使用

一. 框架結構

專案名稱 FruitCar

安裝django 然後執行具指令

django-admin startproject FruitCar

生成如下目錄結構:

Fruitcar   專案的容器(可以將它重新命名)
    FruitCar 包含你的專案,它是一個純 Python 包。它的名字就是當你引用它內部任何東西時需要用到的 Python 包名
        __init__.py 一個空檔案,告訴 Python 這個目錄應該被認為是一個 Python 包
        settings.py  Django 專案的配置檔案
        urls.py 路由配置檔案
        wsgi.py 專案的執行在 WSGI 相容的Web伺服器上的入口
    templates 專案模板資料夾(前後端不分離時前端頁面部分放這裡)
    manage.py 管理 Django 專案的命令列工具

建立專案後可以使用以下命令啟動專案

 python manage.py runserver

特定埠廣播式啟動方式:

 python manage.py runserver 0.0.0.0:8001
 //0.0.0.0並不是一個真實的的IP地址,它表示本機中所有的IPV4地址。監聽0.0.0.0的埠,就是監聽本機中所有IP的埠

到這一步我們專案的框架基本是通了, 寫幾個靜態頁面放上去一個專案也算完成了。但我們的目的是開發功能所以我們需要出去建立app,習慣上每個大的功能分一個app 會是的專案清晰有利於專案管理和開發。
例如:我這個專案中有個我要進行車輛的管理和水果的管理我就建立一個car app 和一個fruit app 在每個app中處理它們各自的邏輯功能。

如果檔案中有_init_.py 檔案就表示改檔案所在的資料夾是一個python可識別的Python包, 以後不再贅述

建立app指令

python manage.py startapp car
python manage.py startapp fruit

系統會自動生成app專案結構一個基本結構:

    __init__.py
    admin.py
    apps.py
    migrations 遷移檔案 與資料庫有關建立表執行遷移指令是自動生成
        __init__.py
    models.py 資料表設定檔案相當於mvc中的m
    tests.py
    urls.py 自己建立檔案,用來控制這個app中的api,也可以直接寫在FruitCar檔案的urls.py 檔案中
    templates 自己建立資料夾 存放html等檔案 
    views.py  檢視檔案相當於mvc中的v,c

二. Django生命週期

Django 生命週期為: 使用者請求發起對url的請求→ wsgiref模組→django中介軟體→django(檢視url對應函式,模型資料庫互動,html模版渲染)→django中介軟體 → wsgiref模組 →使用者看到的頁面

請求到返回的全過程如下圖所示:
python-Django基本流程原理

三. Django中介軟體

中介軟體

中介軟體是一個用來處理Django的請求和響應的框架級別的鉤子, 用於在全域性範圍內改變Django的輸入和輸出.

中介軟體的五種方法

  1. process_request 方法
執行時間 引數 返回值 執行順序
在檢視函式之前,在路由匹配之前 請求物件,與檢視中用到的request引數是同一個物件 None:按照正常的流程走 HttpResponse:接著倒序執行當前中介軟體的以及之前執行過的中介軟體的process_response方法,不再執行其它的所有方法 按照MIDDLEWARE中的註冊的順序執行,也就是此列表的索引值
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
allow_url = ["/admin/", "/car/", "/fruit/"]


class Test2(MiddlewareMixin):
    def process_request(self, request):
        print("可以用來控制請求的api等")
        if request.path_info in allow_url:
            return
        else:
            return HttpResponse("這裡是 HttpResponse")
  1. process_response 方法
執行時間 引數 返回值 執行順序
最後執行 1.request:請求物件,與檢視中用到的 2. request引數是同一個物件response:響應物件,與檢視中返回的response是同一個物件 response:必須返回此物件,按照正常的流程走 按照註冊的順序倒序執行
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class Test(MiddlewareMixin):
    def process_request(self, request):
        print("這是一箇中介軟體 --> request test")

    def process_response(self, request, response):
        print("這裡是 Test 的 HttpResponse")
        return HttpResponse("這是 Test 返回的 HttpResponse")

process_request和process_response 的執行流程如下圖:
python-Django基本流程原理

  1. process_view 方法
執行時間 引數 返回值 執行順序
在process_request方法及路由匹配之後,檢視之前 1. request:請求物件,與檢視中用到的request引數是同一個物件。 2. view_func:將要執行的檢視函式(它是實際的函式物件,而不是函式的名稱作為字串)。 3. view_args:url路徑中將傳遞給檢視的位置引數的元組 。 4. view_kwargs:url路徑中將傳遞給檢視的關鍵值引數的字典 1. None:按照正常的流程走。 2. HttpResponse:它之後的中介軟體的process_view,及檢視不執行,執行所有中介軟體的process_response方法 按照註冊的順序執行
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class Test(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        '''
        :param request: 瀏覽器發來的 request 請求物件
        :param view_func: 將要執行的檢視函式的名字
        :param view_args: 將要執行的檢視函式的位置引數
        :param view_kwargs: 將要執行的檢視函式的關鍵字引數
        :return:
        '''
        print("這裡是 Test 的 process_view 函式")
        print(view_func, type(view_func))

執行過程如下圖:
python-Django基本流程原理

  1. process_template_response 方法

在檢視函式返回的物件有一個render()方法(或者表明該物件是一個TemplateResponse物件或等價方法)時,才被執行

執行時間 引數 返回值 執行順序
檢視之後,process_exception之前 1.request:請求物件,與檢視中用到的request引數是同一個物件。 2. response:是TemplateResponse物件(由檢視函式或者中介軟體產生) response:必須返回此物件,按照正常的流程走 按照註冊的順序倒序執行

middleware.py

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class Test(MiddlewareMixin):
    def process_request(self, request):
        print("這是一箇中介軟體 --> test")

    def process_template_response(self, request, response):
        print("這裡是 Test 的 process_template_response")

views.py

from django.shortcuts import render, HttpResponse, redirect


def index(request):
    print("這裡是 index 頁面")
    rep = HttpResponse("這裡是主頁面 index")

    def render():
        print("這裡是 index 函式裡的 render 方法")
        return HttpResponse("index")
    rep.render = render
    return rep
  1. process_exception 方法

只在檢視中觸發異常時才被執行

執行時間 引數 返回值 執行順序
檢視之後,process_response之前 1. request:請求物件,與檢視中用到的request引數是同一個物件。 2. exception:檢視函式異常產生的Exception物件 1. None:按照正常的流程走。 2. HttpResponse物件:不再執行後面的process_exception方法 按照註冊的順序倒序執行

middlwware.py

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class Test(MiddlewareMixin):
    def process_request(self, request):
        print("這是一箇中介軟體 --> test")

    def process_exception(self, request, exception):
        print("這裡是 Test 的 process_exception")
        print(exception)

views.py

from django.shortcuts import HttpResponse


def index(request):
    print("這裡是 index 頁面")
    raise ValueError("這是一個主動丟擲的錯誤")
    return HttpResponse("這裡是主頁面 index")

中介軟體5個方法的執行如圖下所示:

python-Django基本流程原理

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章