# DRF框架

Django REST framework 框架是一个基于django用于构建Web API 的强大而又灵活的工具

特点:

  • 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
  • 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
  • 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;多种身份认证和权限认证方式的支持;
  • 内置了限流系统;
  • 直观的 API web 界面;
  • 可扩展性,插件丰富

对django的增加

# 使用方式

  • 安装

    pip install djangorestframework
    
  • 注册 在settings.py的INSTALLED_APPS中添加'rest_framework'

    INSTALLED_APPS = [
        ...
        'rest_framework',
    ]
    

# 功能

# 倪补django序列化

# 自建序列化类

继承rest_framework.serializers.Serializer

class UserInfoSerializer(serializers.Serializer): 
    """用户信息序列化器"""
    name = serializers.CharField(help_text='用户信息', max_length=18,required=True)
    pwd = serializers.CharField(help_text='密码', min_length=6, max_length=18, required=True)
    email = serializers.EmailField(help_text='邮箱', required=True) 
    age = serializers.IntegerField(help_text='年龄', max_value=200,min_value=0)

字段类型参考文档

  • 序列化: 将python对象 ---> 转换为json格式数据

    from rest_framework.renderers import JSONRenderer 
    # 查询用户对象
    obj = UserInfo.objects.get(id=1) 
    # 创建序列化对对象
    u = UserInfoSerializer(obj) 
    # 将得到的字段,转换为json数据 
    JSONRenderer().render(u.data)
    
  • 反序列化: 将json格式数据 转换为python对象

    # 反序列化
    ser = UserInfoSerializer(data=data) 
    # 校验数据
    ser.is_valid() 
    # 保存数据 
    ser.save()
    

# 模型序列化

为了方便我们定义序列化器,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类

ModelSerializer与常规的Serializer相同,但提供了:

  • 基于模型类自动生成一系列字段
  • 基于模型类自动为Serializer生成validators,比如unique_together
  • 包含默认的create()和update()的实现

class UserInfoSerializer(serializers.ModelSerializer): 
    class Meta:
        model = UserInfo
        # fields = '__all__'	# 所有字段
        fields = ('id','age','pwd') # 指定序列化得字段
        exclude = ('id',) # id字段不参与序列化
        read_only_fields = ('id',) # 只读字段
        # 通过字段名指定字段对应的参数和值
        extra_kwargs = {
            'pwd': {'min_value': 0, 'required': True},
        }

# 请求和响应

# request

REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据

  1. request.data属性 request.data 获取请求体数据。
    • 支持 · POST , PATCH 方法传递的请求体参数
    • 不仅支持表单类型数据,也支持JSON数据,还支持文件数据的获取
  2. request.query_params属性 request.query_params获取查询字符串参数的,Django的 request.GET 的作用一样

# response

REST framework提供了一个响应类 Response ,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。

Response(data, status=None, template_name=None, headers=None, content_type=None)

data 不能是复杂结构的数据,如Django的模型类对象,对于这样的数据我们可以使用Serializer 序列化器序列化处理后(转为了Python字典类型)再传递给data 参数

Response参数说明:

  • data: 为响应准备的序列化处理后的数据;
  • status: 状态码,默认200;
  • template_name: 模板名称,如果使用HTMLRenderer 时需指明;
  • headers: 用于存放响应头信息的字典;
  • content_type: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数

# 视图装饰器

REST 框架提供了两个可用于编写 API 视图的包装器。

  • 用于处理基于函数的视图的装饰器。@api_view
  • 用于处理基于类的视图的类。 APIView 下面我们通过@api_view 这个装饰器来实现增删查改接口
Last Updated: 12/10/2024, 1:57:19 PM