django中的中间件

1. 什么是中间件

中间件是django的门户,在请求响应进入进出django的时候,都需要先经过中间件,用来全局改变django的输入和输出。
image

django中自带7个中间件,每个中间件都有其特定的功能,并且django支持自定义中间件。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

2. 为什么要有中间件

django中涉及到全局相关的功能,都可以利用中间件来完成,例如:

1.全局身份的校验
2.全局用户权限的校验
3.全局访问频率的校验等等

3. 如何自定义中间件

django给自定义中间件类提供了5个自定义的方法,分别是:

1.process_request
2.process_response
3.process_view
4.process_templates_response
5.process_exception
前两个必须掌握,后三个了解即可!

自定义的步骤:

1.在项目文件或者应用文件下创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名字的py文件
3.在该py文件中定义一个类,该类必须继承MiddlewareMixin类
(需要导入MiddlewareMixin类,from django.utils.deprecation import MiddlewareMixin)
4.定义的类里面必须至少有一个自定义方法
5.在setting.py里面注册该中间件的路径

image

3.1 process_request方法详解

1.请求来的时候会经过每一个中间件的process_request方法,经过的顺序是setting.py里中间件注册的顺序从上往下
2.该方法有一个request参数
3.如果中间件里没有该方法,则直接跳过该中间件,执行下一个。
4.如果该方法中返回了HttpResponse对象,则请求将不在往下执行,直接走同级的process_response返回
(flask框架是需要走完所有的类似于proces_response方法)
5.process_request就是用来作全局相关的所有限制功能

3.2 process_response方法详解

1.响应走的时候会经过每一个中间件的process_response方法,经过的顺序是setting.py里中间件从下往下的顺序
2.该方法有两个参数request和response参数
3.该方法必须返回一个HttpResponse对象,默认是返回response,即return response;也可以自定义返回其他
4.如果中间件里没有该方法,则直接跳过该中间件,执行下一个。

3.3 其他需要了解的方法

process_view
	路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该放法
	顺序是按照配置文件中注册的中间件从上往下的顺序依次执行

process_template_response
	返回的HttpResponse对象有render属性的时候才会触发
	顺序是按照配置文件中注册了的中间件从下往上依次经过

process_exception
	当视图函数中出现异常的情况下触发
	顺序是按照配置文件中注册了的中间件从下往上依次经过

4.小作业

要求:写一个中间件,使得每次请求来的时候,不管是urlencoded编码格式还是json编码格式传到后端的数据都变成字典格式封装到request.data里!

前端页面的搭建:

简单输入框的搭建和两种提交方式提交数据

<body>
<form action="" method="post">
    <label for="">用户名:</label>
    <input type="text" name="name" id="id_username">
    <label for="">密码:</label>
    <input type="text" name="pwd" id="id_password">
    <input type="submit">
    <input type="button" id="btn" value="提交2">
</form>
</body>
<script>
    $('#btn').click(function (){
        $.ajax({
            type:'post',
            url:'',
            data:JSON.stringify({
                'name':$('#id_username').val(),
                'pwd':$('#id_username').val(),
                'csrfmiddlewaretoken':'{{ csrf_token }}',
            }),
            contentType:'application/json',
        })
    })
</script>
</html>

中间件的书写:

from django.utils.deprecation import MiddlewareMixin
import json

class JsonMiddle(MiddlewareMixin):
    # 请求来的时候经过这个中间件
    def process_request(self,request):
        try:
            # 未出现异常(当前端传来的是json格式数据时),将json格式数据反序列化放入request.data中
            request.data = json.loads(request.body)
        except Exception as e:
            # 当出现异常(前端传来的是urlencoded编码格式的数据时),也将数据交给request.data中
            request.data = request.POST
            # 这个不管前端是什么格式的数据,我后端request.data里的数据格式都是字典格式
            # 只不过request.POST格式的字典格式是QueryDic字典格式,比平常的字典格式更强大的是不能随意删除该字典中的值,删除会保存

中间件的注册:
image

后端视图书写:

此时urlencoded编码格式和json格式都是在request.data中以字典形式存在

def index(request):
    if request.method == 'POST':
        print(request.data)
    return render(request,'index.html')

注意点:
1.form表单和ajax提交有可能会重复提交,form表单中(有ajax请求)submin类型和button按钮都会触发form表单提交,input标签的button则不会触发form表单提交

2.QueryDict本身就是一个字典,但是比字典强大,不能修改值,一修改报错

3.CommonMiddleware读一下这个django中间件

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django中的中间件 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • flask操作数据库

    flask操作数据库 准备工作 安装flask-script(版本过高可能会报错) pip install flask-script==2.0.3 使用flask-script里的Manager类实例化来管理项目的启动等 from apps import create_app from flask_script import Manager app = cr…

    2023年4月2日
    00
  • 关于编辑器和解释型编译型语言

    各种语言用到的编辑器 python开发:pycharm(收费),vscode(免费),sublintext, go开发:goland(收费),vscode,国产的 java:idea(收费),eclipse(免费),MyEclipse(收费) android:androidstudio(免费),eclipse+adt 前端:webstorm(收费) php:…

    Python开发 2023年4月2日
    00
  • 支付宝支付

    支付宝支付流程 在python中封装alipay 安装 >: pip install python-alipay-sdk –upgrade # 如果抛ssl相关错误,代表缺失该包 >: pip install pyopenssl 结构 libs ├── AliPay # aliapy二次封装包 │ ├── __init__.py # 包文件 │…

    2023年4月2日
    00
  • admin后台管理数据库里的表

    admin后台管理 django给您提供了一个可视化图形界面,来方便您来对数据库里的表进行增删改查的管理 但是!使用admin后台管理你自己注册的模型表时,需要自行进行先注册该表! 在应用下的admin.py里进行注册: from django.contrib import admin from app01 import models # Register …

    2023年4月2日
    00
  • 文章的评论(跟评论与子评论的制作)

    文章的评论制作 先做跟评论,在做子评论 发表评论框的制作:前端渲染发表评论框: {# 评论功能开始#} {% if request.user.is_authenticated %} <div> <p><span class=”glyphicon glyphicon-comment”>发表评论:</span>&l…

    2023年4月2日
    00
  • git的介绍和使用

    git介绍 什么是git git是一种版本控制器 – 控制的对象是开发的项目代码 什么是版本控制器 完成 协同开发 项目,帮助程序员整合代码 i)帮助开发者合并开发的代码 ii)如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 软件:SVN 、 GIT(都是同一个人的个人项目) github、gitee(两个采用git版本控制器管理代码的公…

    2023年4月2日
    00
  • 实时展示用户上传的头像

    实时展示用户上传的头像 总体思路 “”” 1.首先需要给对应的上传头像input框绑定一个文本域变化事件 (当检测到用户对该文件框上传了头像就会触发一系列操作) 2.再生成一个文件阅读器对象 3.再获取用户上传的文件头像 4.把用户上传的文件头像交给文件阅读器对象FileReader读取 5.利用文件阅读器把读取的文件头像结果展示到前端页面 (修改img的s…

    Python开发 2023年4月2日
    00
  • 模板语法之标签

    语法 {% 开始标签 %} …. {% 结束标签%} if标签 例:{% if … %} {% elif %} {% else %} {% endif %} if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。 for标签 # for 标签带有一个可选的{% empty %…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部