drf框架--基础

目录

  • drf框架

    • 导入
    • 什么是接口
    • restful接口规范
    • 原生Django实现接口
    • drf框架
    • Django CBV 和drf CBV对比
    • 响应渲染模块
    • 请求数据解析模块
    • 响应模块

drf框架

导入

  • http协议

    http协议是基于应用层的协议

    在发出请求时,需要具备请求首行,请求头,请求体

    特点:无状态无连接,且都是客户端先发起请求,服务端再进行响应

  • wsgi协议

    主要就是规定了数据的解析方式,把get之类的http请求解析封装到request里面

    在视图函数返回的时候,再把数据打包成http协议需要的格式传到前台

什么是接口

根据客户端传回的需求,进行路由匹配,调用相应的接口,然后接口执行完成的的数据,按照需要的格式进行返回。

  • 接口具有特定的url链接
  • 相应的请求方式:get、post、put、patch、delete
  • 前台请求的参数
  • 最后响应的结果

restful接口规范

  1. 一般采用安全协议,因为接口都是对数据进行操作
  2. 在url中要体现接口的关键字api,如:

    http://api.baidu.comhttp://www.baidu.com/api

  3. 接口操作的数据称之为资源,前台请求数据的时候要采用资源的复数形式

    http://api.baidu.com/books/http://www.baidu.com/api/books

  4. 接口的链接中不能出现操作资源的方式,一般通过请求方式来决定操作资源的方式

    五大接口:

    • get:获取所有
    • get:获取一个
    • post:增加一个
    • put | patch:修改整体 | 修改部分
    • delete:删除一个
  5. 当资源数据有多个版本时,接口要做到版本控制

    http://api.baidu.com/books/v1/

  6. 资源响应的限制条件:筛选、排序……

    http://api.baidu.com/books/?publish=1&ordering=-price&limit=3

  7. 数据相应的状态码,类似于网络状态码,约定俗成为0,1,2

    {‘status’: 0 | 1 | 2}

    -- SUCCESS(0, "查询成功")
    -- NODATA(1, "非正确,无数据,显示基本信息")
    -- FEAILED(2, "查询失败")

  8. 响应的结果需要有信息描述

    {‘status‘: 0, ‘msg‘: ‘success‘}

  9. 响应的结果
    • get所有:返回所有的资源
    • get一个:返回一个资源
    • post增加一个:返回增加的资源
    • put | patch修改:返回修改的资源
    • delete:不做任何返回

注意:需要通过接口文档告诉前台传递的必要和选填参数,以及返回的数据内容结构

原生Django实现接口

创建一个新的django项目,默认创建一个app,名为api

# 主路由urls.py

from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include('api.urls')),
]

# 子路由 api/urls.py

from django.conf.urls import url
from . import views
urlpatterns = [
    # as_view() 本质拿到 view函数地址,
    # view内部通过dispatch分发请求给具体的(get|post|delete)方法处理请求
    # 处理完后的响应结果会一层层返回
    url(r'^books/$', views.BookView.as_view()),
    url(r'^books/(?P<pk>.*)/$', views.BookView.as_view()),
]

# 模型层 api/models.py

from django.db import models
class Book(models.Model):
    name = models.CharField(max_length=64)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    class Meta:
        db_table = 'old_boy_book'
        verbose_name = '书籍'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.name
# 模型层创建完成之后,完成数据库的迁移
# python manage.py makemigrations
# python manage.py migrate

# 视图层 api/views
from django.views import View
from django.http import JsonResponse
from . import models
class BookView(View):
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:  # 通过是否有主键决定获取单个或是全部资源
            book_dic_list = models.Book.objects.filter(pk=pk).values('name', 'price')
            if not book_dic_list:
                return JsonResponse({
                    'status': 2,
                    'msg': 'pk值有误',
                    'results': {}
                })
            return JsonResponse({
                'status': 0,
                'msg': 'ok',
                'results': book_dic_list[0]
            })

        book_dic_list = models.Book.objects.all().values('name', 'price')
        if not book_dic_list:
            return JsonResponse({
                'status': 2,
                'msg': '无数据',
                'results': {}
            })
        return JsonResponse({
            'status': 0,
            'msg': 'ok',
            'results': list(book_dic_list)
        })

drf框架

  • 安装

    pip install djangorestframework

  • 配置
    # 注册drf app
    # settings.py
    NSTALLED_APPS = [
        # ...
        'rest_framework',
    ]
  • 特点
    # 具体功能在具体模块下
    from rest_framework.request import Request
    from rest_framework.response import Response
    from rest_framework.exceptions import APIException
    from rest_framework.filters import OrderingFilter
    from rest_framework.views import APIView
    from rest_framework.pagination import PageNumberPagination
    from rest_framework.settings import APISettings
    
    # 自定义drf配置 - 在自己的settings.py
    REST_FRAMEWORK = {
        # 自定义修改drf的配置们
    }

Django CBV 和drf CBV对比

  • Django CBV

    1. 继承了View视图类
    2. 通过as_view()来获取view函数地址
    3. 请求来了之后,调用view函数,内部调用dispatch函数完成请求的分发
    4. dispatch函数将请求方式映射成视图类的同名方法,完成请求的处理,得到相应、
    5. 最后将相应的结果一层层返回
  • drf CBV

    1. 继承了APIView
    2. 通过as_view()(继承自django的as_view)获取view函数地址,但在view函数中局部禁用了csrf认证
    3. 请求来了调用view函数,内部调用(APIView类的)dispatch函数完成请求分发
    4. dispatch函数 二次封装request进行三大认证后,再将请求方式映射成视图类的同名方法,完成请求的处理,得到相应,再对相应做渲染处理
    5. 最后将相应的结果一层层返回

响应渲染模块

就是返回数据的形式:json和浏览器接口页面

分析

# 入口: APIView类的dispatch函数
self.response = self.finalize_response(request, response, *args, **kwargs)
--> neg = self.perform_content_negotiation(request, force=True)
--> renderers = self.get_renderers()
--> self.renderer_classes
--> APISetting:DEFAULT_RENDERER_CLASSES

局部配置

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.renderers import JSONRenderer
from rest_framework.renderers import BrowsableAPIRenderer
class UserAPIView(APIView):
    # 局部配置:只有该视图类起作用
    renderer_classes = [JSONRenderer]  # 只提供JSON数据渲染
    pass

全局配置

# drf配置
REST_FRAMEWORK = {
    # 响应的渲染模块
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}

请求数据解析模块

前端请求的数据进行解析的方式:json、form-data、urlencoding

分析

# 入口:APIView类的dispatch函数
request = self.initialize_request(request, *args, **kwargs)
--> parsers=self.get_parsers()
--> self.parser_classes
--> APISetting:DEFAULT_PARSER_CLASSES

局部配置

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.parsers import JSONParser
from rest_framework.parsers import FormParser
from rest_framework.parsers import MultiPartParser
class UserAPIView(APIView):
    # 局部配置:只有该视图类起作用
    parser_classes = [JSONParser]  # 只提供JSON解析
    pass

全局配置

# drf配置
REST_FRAMEWORK = {
    # 请求数据解析模块
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',  # 'application/json'
        'rest_framework.parsers.FormParser',  # 'application/x-www-form-urlencoded'
        'rest_framework.parsers.MultiPartParser'  # multipart/form-data
    ],
}

请求的数据解析的位置

  1. 如果是数据包,则都解析到request.data中
  2. 如果是url中/?参数则解析到request.query_params中

响应模块

# 响应可以设置响应数据、响应网络状态码、响应头、响应数据类型等
data = {
    'status': 0,
    'msg': 'get ok',
    'results': [],
    'token': '123.12321.231'
}
return Response(
    data=data,
    status=status.HTTP_200_OK,
    headers={'Token': '123as.masd21.asd213sd'},
    content_type='application/json'  # 默认就是application/json
)

原文地址:https://www.cnblogs.com/Hades123/p/11455876.html

时间: 2024-08-30 10:31:18

drf框架--基础的相关文章

DRF框架 之基础配置

Vue框架的总结 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 {{ }} v-text|html => 限制一次性渲染 v-once v-if|show v-if v-else-if v-else v-for v-model v-bind [c1, c2] | {active: isActive} v-on fn | fn(...) | fn($event, .

drf框架, 接口(api) Django FBV =&gt; CBV drf框架的基础试图类 drf核心组件 群查与单查 python换源

接口 """ 接口概念:前台与后台进行信息交互的媒介 - url链接 接口组成: url链接 - 长得像返回数据的url链接 请求方式 - get(查).post(增).put(整体改).patch(局部改).delete(删) 请求参数 - 拼接参数.数据包参数(urlencoded.form-data.json) 响应结果 - 响应的json数据 """ 开发阶段接口测试工具 """ Postman: 官网下载.

DRF框架之 serializers 序列化组件

1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers 分为:第一种 Serializer   第二种 ModelSerializer 第一种用法之 Serializer from django.db import models # Create your models here. class Book(models.Model): nid = mod

drf框架中jwt认证,以及自定义jwt认证

0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pip install djangorestframework-jwt 使用自带设定好的jwt from django.urls import path from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path(

drf框架相关

drf框架: django-rest framework 1.接口:联系两个物质的媒介,完成信息交互 web程序中:联系前台页面与后台数据库的媒介,已完成信息的交互; web接口组成: url:长得像放回数据的url链接 请求参数:前台按照指定的key提供数据给后台 响应数据:后台与数据库交互后将数据反馈给前台 2.restful接口规范 -> 规范化书写接口 定义:为了采用不同的后台语言,也能用同样的接口来获取到同样的数据; 接口文档: 写接口要写 url,响应数据 注:如果将请求参数也纳入考

drf框架与postman初始

drf框架 全称:django-rest framework 知识点 """ 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件.解析组件.响应组件 4.序列化组件(灵魂) 5.三大认证(重中之重):认证.权限(权限六表).频率 6.其他组件:过滤.筛选.排序.分页.路由 """ # 难点:源码分析 接口 """ 接口:联系两个物质的媒介,完成

DRF框架中分页功能接口

目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPagination PageNumberPagination是页码分页,这个类可以进行全局设置 LimitOffsetPagination按照偏移量来进行分页 两个类都可以实现,在程序的具体设计上会有一部分的差别,但是差别不大. CursorPagination加密分页功能 二.使用PageNumbe

DRF框架之视图的扩展类简介

这里呢,我将为大家介绍一下DRF框架,为我们提供的试图扩展类的使用方法即作用. 在使用视图扩展类时,需要将mixins模块导入到view文件中. from rest_framework import mixins 并且,在使用视图扩展类时,必须结合GenericAPIView基类一起使用. 所谓,视图的扩展类,就是GenericAPIView的子类,他们继承自GenericAPIView类,并在此基础上封装了增删改查的功能函数. 模板代码: class BookInfoAPIView(mixin

DRF框架知识总览

DRF框架知识总览 """ 1)接口(api): 什么是接口 接口文档 接口规范 2)FBV => CBV:Function|Class Base View CBV的请求生命周期 CBV比FBV的优势 3)drf框架的基础试图类 APIView:请求模块.解析模块.渲染模块.响应模块.异常模块 4)drf核心组件 序列化组件:将后台的任何数据,进行序列化返回给前台:将前台的数据反序列化成后台model对象再入库 三大认证组件:认证组件.权限组件(RBAC).频率组件 视