django框架之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)
posted @   吴仁耀  阅读(234)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
  1. 1 原来你也在这里 周笔畅
  2. 2 世间美好与你环环相扣 柏松
  3. 3 起风了 吴青峰
  4. 4 极恶都市 夏日入侵企划
世间美好与你环环相扣 - 柏松
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 尹初七

作曲 : 柏松

编曲 : 彭圣杰

偏偏秉烛夜游

偏偏秉烛夜游

午夜星辰 似奔走之友

爱你每个结痂伤口

酿成的陈年烈酒

入喉尚算可口

入喉尚算可口

怎么泪水 还偶尔失守

邀你细看心中缺口

裂缝中留存 温柔

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

让樱花偷偷 吻你额头

让世间美好 与你环环相扣

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

当樱花开的纷纷扬扬

当世间美好 与你环环相扣

特别鸣谢:槿葵,我们的海报制作妹妹。

原唱:柏松

吉他:柏松

和声:柏松

录音:柏松

混音:张强

点击右上角即可分享
微信分享提示