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模組 →使用者看到的頁面
請求到返回的全過程如下圖所示:
三. Django中介軟體
中介軟體
中介軟體是一個用來處理Django的請求和響應的框架級別的鉤子, 用於在全域性範圍內改變Django的輸入和輸出.
中介軟體的五種方法
- 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")
- 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 的執行流程如下圖:
- 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))
執行過程如下圖:
- 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
- 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個方法的執行如圖下所示:
本作品採用《CC 協議》,轉載必須註明作者和本文連結