首页 > 其他分享 >django框架之drf(部分讲解)

django框架之drf(部分讲解)

时间:2023-01-31 22:35:25浏览次数:58  
标签:api 接口 django books https 讲解 序列化 com drf

restful规范(重要)

一、概念

REST全称是Representational State Transfer,中文意思是表述:表征性状态转移,它首次出现在2000年Roy Fielding的博士论文中。

RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中

二、十项规范

协议
  • 数据的安全保障,通常使用https(http+ssl/tsl)协议

  • url链接一般都采用https协议进行传输

  • 采用https协议,可以提高数据交互过程的安全性

域名
版本
路径
资源操作由HTTP的请求方式决定

操作资源一般都会涉及到增删改查,我们提供请求方式来标识增删改查动作

状态码
  • http响应状态码

    • 1xx:请求正在处理

    • 2xx:成功响应

    • 3xx:重定向

    • 4xx:客户端错误

    • 5xx:服务端错误

状态码大全:https://blog.csdn.net/li_chunlong/article/details/120787872

  • 公司内部规定的响应状态码,放在响应体中

    • {code:0} 咱们后期一般使用100 101 102这种
错误处理
  • 返回数据中带错误信息

    • {

    • ​ code:0

    • ​ msg:"ok/用户名错误"

    • }

返回结果(好多公司不遵循这个)
  • GET /collection:返回资源对象的列表(数组)
  • GET /collection/resource:返回单个资源对象
  • POST /collection:返回新生成的资源对象
  • PUT /collection/resource:返回完整的资源对象
  • PATCH /collection/resource:返回完整的资源对象
  • DELETE /collection/resource:返回一个空文档
响应数据中带连接

序列化反序列化

api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把【数据转换格式】,序列化可以分为两个阶段:

序列化(read)

把我们识别的数据转换成指定的格式提供给别人

例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人

反序列化(write)

把别人提供的数据转换/还原成我们需要的格式

例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中

基于django原生编写5个接口

以后写的接口,基本上都是5个接口及其变形

  • 查询所有
  • 查询单个
  • 新增一个
  • 修改一个
  • 删除一个

基于books单表为例,写5个接口

  • 创建book表
  • 表迁移
  • 录入假数据:直接录,后台管理录
  • 写查询所有接口--》 遵循restful规范,使用cbv
  • 新增一个数据---》
  • 查询一个
  • 修改一个:put提交的数据,不能从request.POST中取
  • 删除一个

drf介绍和快速使用

概念

核心思想:缩减编写api接口的代码

Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。

官方文档:https://www.django-rest-framework.org/

github: https://github.com/encode/django-rest-framework/tree/master

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

安装

  • djangorestframework: drf 帮助我们快速的实现符合restful规范的接口

  • django 最新 4.x ,一般都会用最新版的上一版3.x
    drf最新支持到djagno 3.x ,最新不支持2.x

  • 安装drf

    • pip3 install djangorestframework -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/
    • 由于你是django2.x 它发现它不支持,它会自动写在dajgno,安装最新的django 4.x

代码

注意:url的末尾必须要写斜杠符号,不然会报错

# 使用drf编写5个接口(听个响)

# views中
from .serializer import BookSerializer
from rest_framework.viewsets import ModelViewSet
class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

# serializer
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
        
# urls中
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('books', views.BookView, 'books')

urlpatterns = [
    path('admin/', admin.site.urls),
]
# 两个列表相加  [1,2,4] +  [6,7,8]=
urlpatterns += router.urls


		'''
		获取所有图书:Get 	http://127.0.0.1:8000/books/
		获取单个图书:Get 	http://127.0.0.1:8000/books/1/	加上ID号
		新增数据:	POST	http://127.0.0.1:8000/books/	Body内写入数据
		删除数据:	DeLETE	http://127.0.0.1:8000/books/1/	加上ID号
		修改数据:	PUT		http://127.0.0.1:8000/books/2/?name=你问我为什么&price=999&publish=在家出版社
		
		就是这么简单快速 五个接口就立马写好了 这是DRF的速度
		'''

cbv源码分析

# 1 路由中写的:path('api/v1/books/', views.BookView.as_view()),第二个参数无论是fbv还是cbv放的都是函数内存地址
	-当请求来了,匹配成功会执行,views.BookView.as_view()(request)
    -views.BookView.as_view()执行结果是View的类方法as_view返回的结果是内层函数view,是个函数内层地址
    -本身请求来了,匹配成功,会执行view(request)
    def view(request, *args, **kwargs):
        return self.dispatch(request, *args, **kwargs)
    
    -self.dispatch  View类的方法
   	def dispatch(self, request, *args, **kwargs):
        # request.method请求方式转成小写,必须在列表中才能往下走
        if request.method.lower() in self.http_method_names:
            # 反射,去self【视图类的对象:BookView】,去通过get字符串,反射出属性或方法
            # BookView的get方法
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        # BookView的get方法,加括号,传入request
        return handler(request, *args, **kwargs)

标签:api,接口,django,books,https,讲解,序列化,com,drf
From: https://www.cnblogs.com/oiqwyig/p/17081030.html

相关文章