前后端分离 drf之一

API接口

前后端分离的开发模式:
客户端和服务端采用restful API的交互方式进行交互
前后端代码库分离,前端代码可以进行mock测试
能够独立开发和测试
后端则用postman接口测试软件测试,以保证API的可用性 降低集成风险

前后端分离

API接口 类似于view函数 连接前端和url的
通过网络 规定了前后端信息交互规则的链接 也是前后端信息交互的媒介

API接口的样子:
-url :
    https://api.map.baidu.com/place/v2/search
-请求方式:
   post,get,put,patch,delete
-请求参数:json或者xml的格式的key:value类型数据
     ak:
     region:
     query:
     otuput:json
-响应结果:json或者xml格式的数据 # 现在一般是使用json格式

restful规范

# RESTful是一种定义web API接口的 设计风格 尤其适用前后端分离的应用模式中
规范有10点:
1.数据的安全保障:url链接一般都采用https协议进行传输 
     https就是http+ssl/tsl  # 相当于加密之后的http 更安全
    
2.接口中带API关键词  可以带在url或域名中
3.多数据版本共存
  一个接口存在多个版本
  在url连接中携带版本标识

4.数据即资源,均使用名词 接口尽量使用名词

5.资源操作由请求方式决定method
  获取数据:get请求
  删除数据:delete请求
  新增数据:post请求
  修改数据:put,patch请求
 # 请求的地址一样,通过请求方式决定对资源进行什么样的操作
 
6.url地址中携带过滤参数
7.响应带状态码
  -http状态码:
        1XX : 表示请求正在处理 
        2XX :表示请求处理成功 200 ok 等
        3XX :重定向 302临时重定向 301永久重定向
        4XX :客户端错误 403拒绝访问csrf  404找不到资源
        5XX:服务端错误  500 服务器内部错误
  -响应体中写状态码:按照公司规范来写

8.返回错误信息 响应体中携带错误信息

9.返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
    GET /collection:返回资源对象的列表(数组)[{},{}]
    GET /collection/resource:返回单个资源对象 {}
    POST /collection:返回新生成的资源对象     {}
    PUT /collection/resource:返回完整的资源对象 {}
    PATCH /collection/resource:返回完整的资源对象 {}
    DELETE /collection/resource:返回一个空文档 

一般可能会这么写:
    -获取所有:{code:100,msg:成功,data:[{name:红楼梦,price:99},{name:西游记,price:88}]}
    -获取单条:{code:100,msg:成功,data:{name:红楼梦,price:99}}
    -新增数据:{code:100,msg:新增成功,data:{name:西游记,price:99}}
    -修改数据:{code:100,msg:修改成功,data:{name:西游记v2版本,price:99}}
    -删除数据:{code:100,msg:删除成功}
    
 10.响应中携带链接
    比如图片链接 跳转的地址链接等
 

postman接口测试工具

官网下载:https://www.postman.com/downloads/

本质就是模拟发送http请求

序列化和反序列化

# api接口开发,最核心常见的一个过程就是序列化 就是把数据转换格式
序列化:将我们能够识别的数据转换成指定的格式提供给别人
反序列化:将被人提供的数据转换成我们能够识别的格式

快速使用drf

# 使用django这个web框架 开发前后端分离项目(模板渲染),只写接口
# 写接口:一共五个请求方式和这些方式的变形
 获取所有 get
 获取单个 get
 新增一条 post
 修改一条 put/patch
 删除一条 delete
需要先下载一下模块:
安装drf:pip3 install djangorestframework
第一步 :先在models里面创建一个模型
from django.db import models
class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    publish = models.CharField(max_length=32)

第二步:在项目中创建一个serializer.py
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
第三步:在view里写入接口函数
from .models import Book
from rest_framework.viewsets import ModelViewSet
from .serializer import BookSerializer


class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

第四步:写路由
from django.contrib import admin
from django.urls import path
from rest_framework.routers import SimpleRouter
from app01 import views

router = SimpleRouter()
router.register('books', views.BookView)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('admin/',views.TestView.as_view())
]
urlpatterns += router.urls

CBV源码分析(很重要!!!)

path('/',Views.TestView.as_view())
第一个参数是路径,第二个参数是视图函数的内存地址
在TestView没有找到as_view这个方法,只能去继承的类View中找
as_view被@classonlymethod装饰了 继承了classmethod 本质就是classmethod 专门给类调用的方法
在as_view方法内定义了一个view方法 返回的是TestView().dispatch(reuqest)
当请求来了,路由匹配成功,会执行view(request) 本质是执行TestView().dispatch(reuqest)
查看dispatch发现是个方法里面的判断就是为什么cbv能根据请求的方式的不同匹配到不同的方法
 if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
    
    通过反射方法getattr,获取到提交的请求,最后返回handler()
    self是TestView的对象 handler就是TestView类的方法
    # CBV视图层中,dispatch方法可以说是前端向后端发送请求的调度员,可以根据不同的请求方式执行视图函数中对应的方法
posted @ 2022-09-23 19:29  Hsummer  阅读(83)  评论(0编辑  收藏  举报