python-django中间件介绍

设计

Django框架中的中间件是介于请求与响应处理过程之间的一道处理环节, 它是轻量级且低级的"插件"系统,可以全局改变Django的输入或输出。

这种设计使得我们可以根据需要添加自定义的处理逻辑,以满足各种复杂的需求。

ini 复制代码
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'

每个中间件的功能如下:

  • SecurityMiddleware:为request/response提供了几种安全改进,无它不安全
  • SessionMiddleware:开启session会话支持,无它无session
  • CommonMiddleware:基于APPEND_SLASH和PREPEND_WWW的设置来重写URL,如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL;如果PREPEND_WWW设为True,前面缺少 www.的url将会被重定向到相同但是以一个www.开头的url。
  • CsrfViewMiddleware:添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值,无它无csrf保护
  • AuthenticationMiddleware:在视图函数执行前向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户,无它用不了request.user
  • MessageMiddleware:开启基于Cookie和会话的消息支持,无它无message
  • XFrameOptionsMiddleware:对点击劫持的保护

使用场景

例如,我们可以通过编写中间件来实现一些特定的功能,如用户认证服务、CSRF防御机制和点击劫持防御等。

此外,每个中间件都有其特定的职责,它们会按照预定的规则在特定的时候执行。

例如,Django提供的Authentication middleware组件就会在用户请求时将用户与对应的session进行关联。

中间件可以帮助我们实现针对不同路由做不同的异常响应内容。

  • 比如,我们可以针对/pages做静态页面500处理,对/api做rest 500处理,对/graphql做graphql的异常处理。

然而,由于中间件可以修改全局的输入和输出,因此在使用中间件时需要谨慎,用不好可能会影响应用的性能。

总的来说,中间件的设计为Django框架带来了极大的灵活性和扩展性。

Django REST framework

Django REST framework是一个强大的Web API开发框架,建立在Django框架之上,可以帮助Django REST framework是一个强大的Web API开发框架,建立在Django框架之上,可以帮助开发者快速地构建符合RESTful风格的API。以下是使用Django REST framework的基本步骤:

  1. 安装Django REST framework:可以使用pip来安装djangorestframework库。
  2. 在Django的settings.py文件中添加rest_framework配置。
  3. 创建序列化器(Serializer):序列化器用于定义如何将模型实例转换为Python数据类型,以及如何将Python数据类型转换回模型实例。
  4. 创建视图:视图是处理API请求并返回响应的地方。
  5. 定义URL模式:URL模式用于将URL路由到相应的视图。
  6. 运行服务器:启动Django开发服务器,然后通过浏览器或其他工具访问API。

序列化器(Serializer)

在Django REST framework中需要定一个Serializer 然后交给视图层处理。

序列化器(Serializer)的作用是

  • 将模型实例(Model instance)转换为Python数据类型(如字典)以便将其转换为JSON格式的响应。
  • 同时,它还可以将接收到的JSON数据转换回模型实例,以便进行保存操作。

Django REST framework使用案例

bash 复制代码
pip install django 
pip install djangorestframework

# 创建一个新的Django项目和应用
django-admin startproject myproject 
cd myproject 
python manage.py startapp myapp

myapp目录下的models.py文件中定义一个模型

python 复制代码
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

    def __str__(self):
        return self.name

myapp目录下创建一个名为serializers.py的文件,并定义一个序列化器:

kotlin 复制代码
from rest_framework import serializers
from .models import Person

class PersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = ['name', 'age']

myapp目录下创建一个名为views.py的文件,并定义一个视图:

python 复制代码
from rest_framework import generics
from .models import Person
from .serializers import PersonSerializer

class PersonListCreateView(generics.ListCreateAPIView):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer

myapp目录下创建一个名为urls.py的文件,并定义URL模式

javascript 复制代码
from django.urls import path
from .views import PersonListCreateView

urlpatterns = [
    path('persons/', PersonListCreateView.as_view(), name='person_list_create'),
]

在这个示例代码中,PersonSerializer是一个序列化器,用于将Person模型实例转换为JSON格式的数据。它定义了两个字段:nameage,分别对应于Person模型的这两个属性。通过使用serializers.ModelSerializer基类,我们可以轻松地为模型创建序列化器。

相关推荐
柏油6 小时前
MySQL InnoDB 行锁
数据库·后端·mysql
咖啡调调。6 小时前
使用Django框架表单
后端·python·django
白泽talk6 小时前
2个小时1w字| React & Golang 全栈微服务实战
前端·后端·微服务
摆烂工程师6 小时前
全网最详细的5分钟快速申请一个国际 “edu教育邮箱” 的保姆级教程!
前端·后端·程序员
一只叫煤球的猫6 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
Asthenia04127 小时前
HTTP调用超时与重试问题分析
后端
颇有几分姿色7 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端
AntBlack7 小时前
别说了别说了 ,Trae 已经在不停优化迭代了
前端·人工智能·后端
@淡 定7 小时前
Spring Boot 的配置加载顺序
java·spring boot·后端