zoukankan      html  css  js  c++  java
  • restful规范以及drf框架

    一、接口

    1、接口的基本概念

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

    2、开发阶段接口的测试工具

    """
    Postman:
        官网下载、傻瓜式安装
    """

    3、接口文档

    """
    1)为什么要写接口文档
        为什么要写接口:作为后台开发者,要将后台数据通过url链接反馈给前台
        为什么要写文档:作为后台开发者,一定知道该url链接应该采用什么请求方式、提交哪些数据、返回了哪些结果
    就像后台要将url链接给前台一样,前台知道应该访问什么链接,所以前台也应该知道采用什么请求方式,以及提交什么数据。
        换而言之,接口文档是给 后台开发者、前台开发者、测试等各个项目相关项目组同时查看的,方便团队开发(规则是后台指定的,文档后台来写)
        
    2)编写文档
        i)采用word编写
        ii)drf框架有插件,可以根据cbv的类快速生成文档
        iii)采用写文档的平台比如yapi
        
    3)书写过程
        i)先安装开发需要,完成接口的开发(设置后台url链接,设置请求方式、请求数据、响应结果)
        ii)选择一个接口平台,将后台url链接,设置请求方式、请求数据、响应结果信息变成成文档即可
    """

    4、接口规范

    """
    1)为什么要指定接口规范
        在前后台分离情况下,后台可以采用不同的后台语言,开发出类似的功能,所以前后台请求响应的规则是一致的;如果安装一套标准来编写接口,后台不管是什么语言,前台都可以采用一样的方式进行交互。反过来,后台也不需要管前台到底采用何种方式请求(页面、工具、代码)
        
    2)通用的接口规范:Restful接口规范 - 规定了url如何编写;请求方式的含义;响应的数据规则
        i)url编写
            https协议 - 保证数据安全性
            api字眼 - 标识操作的是数据
            v1、v2字眼 - 数据的不同版本共存
            资源复数 - 请求的数据称之为资源
            拼接条件 - 过滤群查接口数据(https://api.baidu.com/books/?limit=3&ordering=-price)
            
        ii)请求方式
            /books/ - get - 群查
            /books/(pk)/ - get - 单查
            /books/ - post - 单增
            /books/(pk)/ - put - 单整体改
            /books/(pk)/ - patch - 单局部改
            /books/(pk)/ - delete - 单删
        
        iii)响应结果
            网络状态码与状态信息:2xx | 3xx | 4xx | 5xx
                200:常规请求 201:创建成功
                301:永久重定向 302:暂时重定向
                403:请求权限不足 404:请求路径不存在 405:请求方法不存在
                500:服务器异常
            数据状态码:前后台约定规则比如 - 0:成功 1:失败 2:成功无结果
            数据状态信息:自定义成功失败的信息解释(英文)
            数据本体:json数据
            数据子资源:头像、视频等,用资源的url链接
    """

    二、FBV vs CBV

    """
    1)路由绑定
    urlpatterns = [
        # 1)项目启动,将test函数地址绑定给/test/路由
        # 2)请求/test/访问后台,后台就会调用绑定的test函数
        url(r'^test/$', views.test),
        
        # 1)项目启动,将as_view()函数执行结果返回的view函数地址绑定给/test/路由
        # 2)请求/test/访问后台,后台就会调用绑定的view函数
        # 3)view函数会将请求交给dispatch方法完成分发,分发(反射)给视图类的不同方法处理请求
        url(r'^test/$', views.Test.as_view()),
    ]
    
    2)业务处理:
        fbv每一个接口都会对应一个函数来响应请求
        cbv可以将一个资源的增删改查所有操放在一个类中管理,在内部再分方法逐一处理 (高内聚低耦合:六个接口和一个类有关,但都能在类内部处理)
    
    -------
    三个View其实是同一个类
    继承View的目的:
        i)继承as_view()方法,完成路由的配置
        ii)继承dispath()方法,完成请求分发
        注:如果自己写as_view()和dispath()方法,自定义视图类可以不用继承任何类的
    from django.http import JsonResponse
    from django.views import View
    from django.views.generic import View
    from django.views.generic.base import View
    class Test(View):  
        def get(self, request, *args, **kwargs):
            return JsonResponse('cbv ok', safe=False)
    """

    三、CBV源码分析

      通过刚刚的演示,我们可以看到我们朝login提交get请求会自动执行Mylogin里面的get方法,而提交post请求也会自动的执行Mylogin里面的post方法,那么为什么Mylogin可以针对不同的请求方式会自动执行相对应的方法,接下来我们就来研究下Django中的CBV源码剖析

    1、研究源码的突破口

      url(r'^login/', views.Mylogin.as_view())

      猜想:

        as_view要么是类里面定义的普通函数 @staticmethod

        要么是类里面定义的绑定给类的方法 @classmethod

      所以接下来我们就点进去as_view看下,结果看源码发现是@classmethod,可以确定是绑定给类的方法

    注意:看源码并一定要每一句都能够看懂 只看自己能够看懂的即可

    2、演示

    四、pip换源

    1、源介绍

    """
    1、采用国内源,加速下载模块的速度
    2、常用pip源:
        -- 豆瓣:https://pypi.douban.com/simple
        -- 阿里:https://mirrors.aliyun.com/pypi/simple
    -- 清华:https://pypi.tuna.tsinghua.edu.cn/simple   3、加速安装的命令: -- >: pip install -i https://pypi.douban.com/simple 模块名(注意这个是临时使用)
    """

    2、永久配置安装源

    Windows

    """
    1、文件管理器文件路径地址栏敲:%APPDATA% 回车,快速进入 C:Users电脑用户AppDataRoaming 文件夹中
    2、新建 pip 文件夹并在文件夹中新建 pip.ini 配置文件
    3、新增 pip.ini 配置文件内容
    """

    MacOS、Linux

    """
    1、在用户根目录下 ~ 下创建 .pip 隐藏文件夹,如果已经有了可以跳过
        -- mkdir ~/.pip
    2、进入 .pip 隐藏文件夹并创建 pip.conf 配置文件
        -- cd ~/.pip && touch pip.conf
    3、启动 Finder(访达) 按 cmd+shift+g 来的进入,输入 ~/.pip 回车进入
    4、新增 pip.conf 配置文件内容
    """

    3、配置文件内容

    """
    [global]
    index-url = http://pypi.douban.com/simple
    [install]
    use-mirrors =true
    mirrors =http://pypi.douban.com/simple/
    trusted-host =pypi.douban.com
    """

    五、DRF框架

    1、安装

    """
    1)安装
    >: pip install djangorestframework
    
    2)在settings中注册(为什么要注册,后期会讲)
    INSTALLED_APPS = [
        # ...
        'rest_framework',
    ]
    
    3)在settings中自定义drf配置
    注:drf配置查找顺序,自定义settings的REST_FRAMEWORK配置字典 => drf默认settings的DEFAULTS
    REST_FRAMEWORK = {}
    
    4)drf的封装特点:特点功能在特点模块下
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.request import Request
    """

    2、图书资源准备

    """
    1)在models.py创建Model类
    from django.db import models
    class Book(models.Model):
        name = models.CharField(max_length=64, verbose_name='书名')
        price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='价格')
    
        # 配置类
        class Meta:
            verbose_name_plural = '图书'  # 让admin后台显示中文去除掉_plural后台会加s
    
        def __str__(self):
            return self.name  # 打印名字,魔法方法
            
    2)在admin.py中注册Model类,方便在后台(admin)可视化管理数据
    from django.contrib import admin
    from . import models
    admin.site.register(models.Book)  # admin要控制的model都需要注册一下
    
    3)数据库迁移操作
    >: python manage.py makemigrations
    >: python manage.py migrate
    >: python manage.py createsuperuser  # 创建超级用户
        admin | Admin123
        
    4)浏览器登录admin录入数据:http://localhost:8000/admin
    """

    3、基于restful接口规范的接口设计

    urlpatterns = [
        # 资源books接口的设计
        url(r'^books/$', views.BookAPIView.as_view()),  # 群查、单增
        url(r'^books/(?P<pk>d+)/$', views.BookAPIView.as_view()),  # 单查、单删、单(整体|局部)改    # 这是有名分组,一般用PK不用id
    ]

    4、实现单查群查接口

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from . import models
    class BookAPIView(APIView): def _multiple_get(self): # 不能返回,数据是QuerySet[Obj, Obj],也不能强制转换list # return list(models.Book.objects.all()) # QuerySet[dict, dict] # print(models.Book.objects.values('name', 'price')) # QuerySet[tuple, tuple] # print(models.Book.objects.values_list('name', 'price')) return Response(list(models.Book.objects.values('name', 'price'))) def _single_get(self, pk): # return Response(models.Book.objects.filter(pk=pk).values('name', 'price').first()) # 开发阶段建议能用try的地方,不要使用if判断 try: return Response(models.Book.objects.values('name', 'price').get(pk=pk)) except: return Response('资源不存在') # 单查、群查 def get(self, request, *args, **kwargs): # *args接收所有的无名分组,**kwargs接收有名分组 pk = kwargs.get('pk') if pk: # 单查逻辑 return self._single_get(pk) else: # 群查逻辑 return self._multiple_get()

    六、小结

    """
    1)接口:
        概念:前后台数据交互的桥梁
        组成:url链接 + 请求方法 + 请求数据 + 响应结果
        文档:将接口的四个组成部分书写成一个使用文档
        工具:Postman
        
    2)Restful接口规范:
        i)url链接:https、api、books、v1、?limit=3
            https://www.baidu.com/api/v1/books/?limit=3
        ii)请求方式:get、post、put、patch、delete
            用不同请求方式代表操作资源的不同目的
        iii)响应结果
            网络状态码,状态信息 - 规定好的
            数据状态码,状态信息 - 开发自己约定的
            数据本地 - json数据
            子资源 - 图片、视频返回资源的url链接
    
    3)cbv与fbv
        高内聚低耦合、生命周期 as_view() => dispatch() => 视图类响应方法
        
    4)drf的安装
        pip install djangorestframework
        封装特点:特点功能在特定模块下
        
    5)pip换源
    
    6)基于restful规定的接口设计
        url(r'^books/$', views.BookAPIView.as_view()),  # 群查、单增
        url(r'^books/(?P<pk>d+)/$', views.BookAPIView.as_view()),  # 单查、单删、单(整体|局部)改
        
    7)资源的单查群查案例(orm知识回顾)
    
    """
  • 相关阅读:
    IOC和DI的区别
    hdu 1217(Floyed)
    hdu 2112(字典树+最短路)
    hdu 4081(次小生成树)
    hdu 1811(缩点+拓扑排序+并查集)
    poj 3026(BFS+最小生成树)
    hdu 3635(并查集)
    hdu 3047(扩展并查集)
    hdu 1116(并查集+欧拉路径)
    poj 1679(次小生成树)
  • 原文地址:https://www.cnblogs.com/yafeng666/p/12324314.html
Copyright © 2011-2022 走看看