日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第5天:基于类的视图与中间件

發布時間:2025/4/16 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第5天:基于类的视图与中间件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • ?類視圖引入
  • ?類視圖的定義與使用
  • ?類視圖實現的原理
  • ?在類視圖中使用裝飾器
  • ?類視圖多繼承&Minx擴展類
  • ?中間件

類視圖引入

以函數的方式定義的視圖成為函數視圖,函數視圖便于理解。但是遇到一個視圖對應的路徑提供了多種不同HTTP請求方式的支持時,就需要在一個函數中編寫不同的業務邏輯,代碼可讀性與復用性都不佳

def register(request):"""處理注冊"""#獲取請求方法,判斷是GET/POST請求if request.method == 'GET':#處理GET請求,返回注冊頁面return render(request, 'register.html')else:#處理POST請求,實現注冊邏輯return HttpResponse('這里實現注冊邏輯') 函數視圖示例

在Django中也可以使用類來定義一個視圖,稱為類視圖

def register(View):"""類視圖 處理注冊"""def get(self, request):"處理GET請求, 返回注冊頁面"return render(request, 'register.html')def post(self, request):" 處理POST請求,實現注冊邏輯"return HttpResponse('這里實現注冊邏輯') 類視圖示例

類視圖好處:

  • 代碼可讀性好
  • 類視圖相對于函數視圖通過繼承具有更高的可復用性

?

類視圖的定義與使用

我們要想使用類視圖必須繼承View

from django.views.generic import View

from django.views.generic import Viewclass DemoView(View):def get(self, request):return HttpResponse('get page')def post(self, request):return HttpResponse('post page') DemoView

路由那里,我則需要使用該視圖的as_view方法轉換為函數

from .views import DemoViewurlpatterns = [url(r'^demo/$', DemoView.as_view(), name='demo') ] 路由配置

?

類視圖實現的原理

?按住ctrl,點擊as_view

@classonlymethod def as_view(cls, **initkwargs):"""Main entry point for a request-response process."""...def view(request, *args, **kwargs):self = cls(**initkwargs) #cls就是DemoView類,生成對象if hasattr(self, 'get') and not hasattr(self, 'head'):self.head = self.getself.request = requestself.args = argsself.kwargs = kwargsreturn self.dispatch(request, *args, **kwargs)view.view_class = clsview.view_initkwargs = initkwargsupdate_wrapper(view, cls, updated=())update_wrapper(view, cls.dispatch, assigned=())return view #最終還是返回函數def dispatch(self, request, *args, **kwargs):..#根據請求方法判斷if request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs) 相關源碼

?

在類視圖中使用裝飾器

我們知道在函數視圖中,可以如下使用裝飾器?

def my_decorator(view_func):def wrapper(*args, **kwargs):print('裝飾器被調用')return view_func(*args, **kwargs)return wrapper@my_decorator def func_demo(request):return HttpResponse('func_demo') 函數視圖使用裝飾器

在類視圖中使用為函數視圖準備的裝飾器時,不能直接添加裝飾器,需要使用method_decorator將其轉換為適用于類視圖方法的裝飾器。

?

?

類視圖多繼承& Minx擴展類

使用面向對象多繼承特性,可以通過定義父類(作為擴展類),在父類中定義想要想類視圖補充的方法,類視圖繼承這些擴展類,便可實現代碼服用。定義父類名稱通常以Mixin結尾

class ListModelMixin(object):"""list擴展類"""def list(self, request, *args, **kwargs):print('查詢多條數據')class CreateModelMixin(object):"""create擴展類"""def create(self, request, *args, **kwargs):print('新增一條數據')class DepartmentView(CreateModelMixin, ListModelMixin, View):"""同時繼承兩個擴展類,復用list和create方法"""def get(self, request):self.list(request)return HttpResponse('get page')def post(self, request):self.create(request)return HttpResponse('post page') 示例

?

中間件

Django中的中間件是一個輕量級、底層的插件系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。中間件的設計為開發者提供了一種無侵入式的開發方式,增強了Django框架的健壯性。我們可以可以使用中間件,在Django處理視圖的不同階段對輸入或輸出進行干預。

1、定義一個中間件,在項目中新建一個middlewares.py文件,然后在該文件中定義中間件類:

from django.utils.deprecation import MiddlewareMixin# 定義中間件類: 通過繼承Django的MiddlewareMixin擴展類實現 class MyMiddleware(MiddlewareMixin):def __init__(self, get_response=None):# 服務器啟動,初始化中間件類時被調用,只執行一次super().__init__(get_response)print('init')def process_request(self, request):print('before 視圖')# 注意:可以返回None或者response對象,如果返回response對象,則視圖函數就不會再執行了def process_response(self, request, response):print('after 視圖')return response 自定義中間件

2、在settings.py文件中添加中間件

?

3、定義一個視圖進行測試

def index(request):print('====index===')return HttpResponse('hello world')

?

多個中間件的執行順序

#1、再定義一個中間件類class MyMiddleware2(MiddlewareMixin):def __init__(self, get_response=None):super().__init__(get_response)print('init 2')def process_request(self, request):print('before 視圖 2')def process_response(self, request, response):print('after 視圖 2')return response#2、注冊MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',...'middlewares.MyMiddleware', # 注冊中間件'middlewares.MyMiddleware2', ]#3、執行結果 before 視圖before 視圖 2==index==after 視圖 2after 視圖#4、結論 對于視圖之前執行的 process_request 方法,先 注冊的中間件先執行 對于視圖之后執行的 process_response 方法,后 注冊的中間件先執行 示例說明

轉載于:https://www.cnblogs.com/sellsa/p/10745562.html

總結

以上是生活随笔為你收集整理的第5天:基于类的视图与中间件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧洲日韩综合 | 日日骚一区二区 | 久草热在线观看 | 日本在线不卡一区 | 性v天堂| 黄视频在线观看免费 | 国产白拍 | 欧美一级黄色片视频 | sm乳奴虐乳调教bdsm | 免费污视频| 亚洲视频精品在线观看 | 午夜激情在线播放 | 成年人一级黄色片 | 欧美一区二区三区免 | 椎名空在线播放 | 久草视频在 | 国产av成人一区二区三区 | 国产在线观看黄色 | www亚洲视频 | 国产激情一区二区三区视频免樱桃 | 国产按摩一区二区三区 | 亚洲日本va中文字幕 | 自拍偷拍日韩精品 | 日韩一道本 | 国产一区二区三区在线视频观看 | 美女大逼| 国产专区av| 人妻无码中文久久久久专区 | 娇妻之欲海泛舟无弹窗笔趣阁 | 91色视频| 亚洲精品电影院 | 国产超碰91 | 夜夜涩 | 丰满熟妇人妻av无码区 | 国产山村乱淫老妇女视频 | 毛片在线看片 | 欧美国产在线观看 | 免费日批网站 | 国产色视频一区二区三区qq号 | 精品一区二区久久久久久按摩 | 国产三区在线观看 | 性欧美lx╳lx╳ | 国产精品久久久久久妇女6080 | 国产jizz | 欧美久久综合网 | 丰满少妇一区二区三区专区 | 国产美女久久久久 | 免费色网 | 东北少妇bbbb搡bbb搡 | 1级黄色大片儿 | 99热99热 | 国产精品美女在线观看 | 极品五月天 | 欧美激情69 | 精品深夜av无码一区二区老年 | 日日夜夜爽爽 | 女性裸体无遮挡胸 | 国语对白在线观看 | 国产黄色片在线播放 | 日本吃奶摸下激烈网站动漫 | 日产久久视频 | 在线cao| 欧美三级国产 | 国产三级三级三级三级三级 | 亚洲视频天天射 | 香蕉尹人 | 国产欧美一区二区三区精品酒店 | 自拍偷拍第 | 婷婷综合在线 | 碧蓝之海动漫在线观看免费高清 | 亚洲最大福利网 | 少妇激情偷人爽爽91嫩草 | 无人码人妻一区二区三区免费 | 亚洲男人的天堂av | 成人涩涩软件 | 亚洲精品女人 | 人体裸体bbb欣赏 | 337p粉嫩大胆色噜噜噜 | 天天爱天天插 | 性一交一乱一区二区洋洋av | 亚洲国产成人精品无码区99 | 看全色黄大色黄大片女一次牛 | 日韩毛片免费看 | 啪啪免费小视频 | 毛片在线免费观看网址 | 久久综合激的五月天 | 午夜免费精品 | 男人的天堂avav | 久久久久久久久蜜桃 | 日日夜夜伊人 | 少妇裸体挤奶汁奶水视频 | 色涩色| 黄色中文| 懂色av一区二区三区蜜臀 | 国产在线观看免费播放 | 国产三级在线观看视频 | 新天堂av | 日本久久亚洲 | 国内精品久久99人妻无码 |