【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件开发中间件、知识点小补充子应用的集中管理

一、类试图装饰器

1、装饰器的作用

装饰器实质上就是一个函数,其可以让其他函数在不去改变任何代码的前提下增加额外的功能,装饰器的返回值是一个函数对象。 

类视图使用装饰器
为类视图添加装饰器,可以使用两种方法。
为了理解方便,先定义一个为视图函数准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),以及一个要被装饰的类视图。 

2、基本使用

案例一:为类试图中所有的视图方法都使用装饰器 

需要在views.py中导入的模块 :

from django.utils.decorators import method_decorator

from django.views import View

from django.http import HttpResponse

  • views.py 
from django.utils.decorators import method_decorator
from django.views import View
from django.http import HttpResponse
def Game(func):
    print('今天去玩游戏')

    def wrapper(request):   # 内部函数第一个参数同样也是一个Httprequest对象
        print({'游戏一': '王者','游戏二': '吃鸡'})
        print('请求路径:%s' %request.path)
        return func(request)
    return wrapper


'''类试图使用装饰器'''
# 在method_decorator中,name参数的作用:限制装饰器所使用的范围
@method_decorator(Game,name='dispatch') # 当name参数的值为dispatch的时候表示为当前类试图中所有的视图方法都使用装饰器
class Things(View):
    # 为类中多个视图添加装饰器
    def get(self,request):
        print('打篮球')
        return HttpResponse('篮球')

    def post(self,request):
        print('打排球')
        return HttpResponse('排球')

    def put(self,request):
        print('打羽毛球')
        return HttpResponse('羽毛球')
  •  子路由文件:urls.py
from django.urls import path
from app_1 import views

urlpatterns = [
    path('Happy',views.Things.as_view())
]

 运行时使用Postman发送对应的请求:

  • 发送get请求 

运行结果:

 

  •  发送post请求

 

  •  发送put请求

 

 案例二:给类视图中单个视图函数使用装饰器

 比如给类试图中的get函数使用装饰器,只需要将name='dispatch' 改为 name='get' 即可。其他的请求比如post请求,put请求不能使用装饰器

  •  发送get请求

  •  发送post请求

  案例三:给类视图中多个视图函数使用装饰器

  •  发送get请求

  •  发送post请求

 

  • 发送put请求 

 

 总结

导入的关键模块:method_decorator

from django.utils.decorators import method_decorator  

装饰器装饰类中的所有方法

@method_decorator(装饰器,name=' ')

name的值 -> 'dispatch','get', 'post', 'put', 'delete', 'options'等

注意:name的值一定是一个字符串类型,而不是一个列表或者元组或集合等。 


二、中间件的基本了解 

1、Django中的中间件

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。 

2、中间件的作用

传话人,中间商。能够介入请求与响应的流程之间,可以对请求对象或者响应对象进行修改,修改了之后在传到下一个流程之中进程处理;

同时中间件也可以提升项目的一个安全性。

中间件的作用范围是整个请求响应的流程。

3、内置中间件的简介 

  • 用于安全证书验证:

 'django.middleware.security.SecurityMiddleware'

  • session验证:

'django.contrib.sessions.middleware.SessionMiddleware'

  • 通用中间件,核验请求的地址是否符合标准的请求格式:

'django.middleware.common.CommonMiddleware'

  • Csrf,用于防御跨站请求伪造攻击,当有表单数据的提交时,必须添加csrf_token,否则访问会被拒绝

'django.middleware.csrf.CsrfViewMiddleware'

  • 用于验证用户登录,需要以来session中间件,也就是说session验证的中间件需要出现在此中间件之前

'django.contrib.auth.middleware.AuthenticationMiddleware'

  • 消息处理中间件

'django.contrib.messages.middleware.MessageMiddleware'

  • 欺骗点击防御,页面中可能嵌套了另一个页面,表面上点击响应的内容与实际点击响应的内容不一样

'django.middleware.clickjacking.XFrameOptionsMiddleware'


三、开发中间件

1、中间件的定义方法 

  • 定义一个中间件工厂函数,然后返回一个可以被调用的中间件。
  • 中间件工厂函数需要接收一个可以调用的get_response对象。
  • 返回的中间件也是一个可以被调用的对象,并且像视图一样需要接受一个request对象参数,返回一个response对象。 

 2、使用操作

 案例一:使用一个中间件

在根目录中创建一个中间件目录,然后在其中创建一个py文件,即中间件文件 

def outter(get_response): # get_response
    # 此处的代码在项目加载的时候就已经启动并执行
    print('第一个中间件')
    def inner(request): # request表示请求对象
        print('1')  # 此处的代码是在视图处理之前执行
        response = get_response(request)    # get_response 直接视作一个视图
        print('2')  # 此处代码是在视图处理之后执行
        return response
    return inner

 在views.py中添加一个视图函数

def text(request):
    print('Hello Middleware')
    return HttpResponse('Middleware')

 注册中间件

如果outter在中间件列表中并不是最后一个元素,即最后一个中间件的话,那么response就是下一个中间件。

如果outter在中间件列表中是最后一个元素,那么response就是一个视图。

 运行:

 案例一:使用多个中间件

先创建几个中间件文件,在里面写入函数 

 

注册中间件

 运行:

项目加载时

访问路径后

 

 从以上结果可看到,项目加载时是从下往上,请求试图被处理前前中间件从上至下执行,请求试图被处理后,中间件从下至上执行

3、中间件的开发流程 

中间件开发流程:
1.在项目中创建一个用于存放中间件代码的文件夹

2.在此文件夹中进行中间件的设计
3.中间设计好了之后,需要将自定义的中间件注册到项目之中 


四、 知识点小补充(子应用的集中管理

子应用的集中管理:
如果编辑器版本用的是21以下,需要在配置文件中添加上如下代码

import sys
sys.path.insert(0,os. path.join(BASE_DIR,'apps ' ))

如果编辑器变笨用的是21的同学,虽然不用添加上方代码,但需要将apps文件夹设置成根目录(source root) 

原文地址:https://blog.csdn.net/Oh_Python

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path('authors/$', views.AuthorView.as_view()), re_path('book/(?P\d+)/$', vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = ''' <li><s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 > 依赖jQuery文件 实例-->GET请求: 手动发送 > 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render