• Django视图(四)


    目录

    一、类视图

    1.类视图的使用

    2.类视图的多继承重写dispatch

    二、中间件

    1 .中间件的定义方法

    2 .多个中间件的执行顺序


    一、类视图

    1.类视图的使用

    在Django中也可以使用类来定义一个视图,称为类视图

    使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。如下所示

    1. from django.views.generic import View
    2. class RegisterView(View):
    3. """类视图:处理注册"""
    4. def get(self, request):
    5. """处理GET请求,返回注册页面"""
    6. return render(request, 'register.html')
    7. def post(self, request):
    8. """处理POST请求,实现注册逻辑"""
    9. return HttpResponse('这里实现注册逻辑')

    类视图的好处:

    • 代码可读性好
    • 类视图相对于函数视图有更高的复用性 , 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可

    定义类视图需要继承自Django提供的父类View,可使用from django.views.generic import View或者from django.views.generic.base import View导入,定义方式如上所示。

    配置路由时,使用类视图的as_view()方法来添加

    1. urlpatterns = [
    2. # 视图函数:注册
    3. # url(r'^register/$', views.register, name='register'),
    4. # 类视图:注册
    5. url(r'^register/$', views.RegisterView.as_view(), name='register'),
    6. ]

    2.类视图的多继承重写dispatch

    1. class CenterView(View):
    2. def get(self,request):
    3. return HttpResponse("OK")
    4. def post(self,request):
    5. return HttpResponse("OK")

    使用面向对象多继承的特性。

    1. class CenterView(LoginRequireMixin,View):
    2. def get(self,request):
    3. return HttpResponse("OK")
    4. def post(self,request):
    5. return HttpResponse("OK")

    二、中间件

    Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。

    我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

    1 .中间件的定义方法

    定义一个中间件工厂函数,然后返回一个可以被调用的中间件。

    中间件工厂函数需要接收一个可以调用的get_response对象。

    返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

    1. def simple_middleware(get_response):
    2. # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
    3. def middleware(request):
    4. # 此处编写的代码会在每个请求处理视图前被调用。
    5. response = get_response(request)
    6. # 此处编写的代码会在每个请求处理视图之后被调用。
    7. return response
    8. return middleware

    例如,在book应用中新建一个middleware.py文件,

    1. def my_middleware(get_response):
    2. print('init 被调用')
    3. def middleware(request):
    4. print('before request 被调用')
    5. response = get_response(request)
    6. print('after response 被调用')
    7. return response
    8. return middleware

    定义好中间件后,需要在settings.py 文件中添加注册中间件

    1. MIDDLEWARE = [
    2. 'django.middleware.security.SecurityMiddleware',
    3. 'django.contrib.sessions.middleware.SessionMiddleware',
    4. 'django.middleware.common.CommonMiddleware',
    5. # 'django.middleware.csrf.CsrfViewMiddleware',
    6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
    7. 'django.contrib.messages.middleware.MessageMiddleware',
    8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
    9. 'book.middleware.my_middleware', # 添加中间件
    10. ]

    定义一个视图进行测试

    1. def middleware(request):
    2. print('view 视图被调用')
    3. return HttpResponse('OK')

    执行结果

    注意:Django运行在调试模式下,中间件init部分有可能被调用两次。

    2 .多个中间件的执行顺序

    • 在请求视图被处理,中间件由上至下依次执行
    • 在请求视图被处理,中间件由下至上依次执行

    示例:

    定义两个中间件

    1. def my_middleware(get_response):
    2. print('init 被调用')
    3. def middleware(request):
    4. print('before request 被调用')
    5. response = get_response(request)
    6. print('after response 被调用')
    7. return response
    8. return middleware
    9. def my_middleware2(get_response):
    10. print('init2 被调用')
    11. def middleware(request):
    12. print('before request 2 被调用')
    13. response = get_response(request)
    14. print('after response 2 被调用')
    15. return response
    16. return middleware

    注册添加两个中间件

    1. MIDDLEWARE = [
    2. 'django.middleware.security.SecurityMiddleware',
    3. 'django.contrib.sessions.middleware.SessionMiddleware',
    4. 'django.middleware.common.CommonMiddleware',
    5. # 'django.middleware.csrf.CsrfViewMiddleware',
    6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
    7. 'django.contrib.messages.middleware.MessageMiddleware',
    8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
    9. 'users.middleware.my_middleware', # 添加
    10. 'users.middleware.my_middleware2', # 添加
    11. ]

    执行结果

    1. init2 被调用
    2. init 被调用
    3. before request 被调用
    4. before request 2 被调用
    5. view 视图被调用
    6. after response 2 被调用
    7. after response 被调用
  • 相关阅读:
    C++11改动
    Web前端:20大新AngularJS开发工具
    圣杯布局和双飞翼布局
    LeetCode:318. 最大单词长度乘积(C++)
    【Rust】操作日期与时间
    记一次 .NET 某工控自动化控制系统 卡死分析
    离线升级esp32开发板升级包esp32-2.0.14(最新版已经3.0alpha了)
    【洛谷 P5266】【深基17.例6】学籍管理 题解(映射+分支)
    西门子低代码首席执行官对现代数字化转型的一些看法
    【操作系统】存储器管理:对换
  • 原文地址:https://blog.csdn.net/m0_61491995/article/details/126134825