Django之drf

一、restful规范

1、概念

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

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

2、REST的十个规范

数据的安全保障

  • 通常使用https(http+ssl/tsl)协议

    • url链接一般采用https协议进行传输
    • 采用https协议,可以提高数据交互过程中的安全性

接口中带api标识

路径中带版本信息

数据即是资源,均使用名词,避免动词(核心)

资源操作由请求方式决定(method)

请求地址中带过滤条件

响应中状态码:两套

  • web服务自带状态码

    • 1xx:请求正在处理
    • 2xx:成功
    • 3xx:重定向
    • 4xx:客户端错误
    • 5xx:服务端错误
  • 公司内部规定的状态码,放在响应体中
    • 一般使用1000往后的状态码

返回的数据中带错误信息

  • {

    code:0

    msg: "ok/用户名错误"

    }

返回的结果遵循以下规范

  • GET 获取所有数据:返回资源对象的列表(数组)
  • GET 单个对象:返回单个资源对象
  • POST 新增对象:返回新生成的资源对象
  • PUT 修改对象:返回完整的资源对象
  • DELETE 删除:返回一个空文档

响应数据中带链接

  • 即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
{"link": {
"rel": "collection https://www.example.com/zoos",
"href": "https://api.example.com/zoos",
"title": "List of zoos",
"type": "application/vnd.yourformat+json"
}}

二、序列化、反序列化

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

序列化

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

-字典,列表------》json格式存到文件中了

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

反序列化

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

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

三、drf介绍及快速使用

1、基于django原生编写5个接口

# 以后所写的接口,基本上都是5个接口及其变形
-查询所有
-查询单个
-新增一个
-修改一个
-删除一个 # 基于books单表为例,写5个接口
-创建book表
-表迁移
-录入假数据:直接录,后台管理录
-写查询所有接口---》遵循restful规范,使用cbv
-新增一个数据
-查询一个
-修改一个:put提交的数据,不能从requets.POST中取
-删除一个 import json from django.shortcuts import render # Create your views here.
from django.views import View
from .models import Books
from django.http import JsonResponse class BookViews(View):
def get(self, request):
book_all_queryset = Books.objects.all()
book_data_list = [{'name': book_queryset.name,
'price': book_queryset.price,
'publish': book_queryset.publish}
for book_queryset in book_all_queryset]
return JsonResponse(book_data_list, safe=False, json_dumps_params={'ensure_ascii': False}) def post(self, request):
new_book_obj = Books.objects.create(name=request.POST.get('name'),
price=request.POST.get('price'),
publish=request.POST.get('publish'))
new_book_dict = {
'name': new_book_obj.name,
'price': new_book_obj.price,
'publish': new_book_obj.publish
}
return JsonResponse(new_book_dict, safe=False, json_dumps_params={'ensure_ascii': False}) class BookViews_1(View):
def get(self, request, pk):
book_queryset = Books.objects.filter(pk=pk).first()
if book_queryset:
book_data_dict = {
'name': book_queryset.name,
'price': book_queryset.price,
'publish': book_queryset.publish
}
return JsonResponse(book_data_dict, safe=False, json_dumps_params={'ensure_ascii': False})
return JsonResponse({'msg': '查询失败!无指定编号!'}) def put(self, request, pk):
target_book_queryset = Books.objects.filter(pk=pk).first()
if target_book_queryset:
book_data_dict = json.loads(request.body)
target_book_queryset.name = book_data_dict.get('name')
target_book_queryset.price = book_data_dict.get('price')
target_book_queryset.publish = book_data_dict.get('publish')
target_book_queryset.save() book_data_dict = {
'name': target_book_queryset.name,
'price': target_book_queryset.price,
'publish': target_book_queryset.publish
}
return JsonResponse(book_data_dict, safe=False, json_dumps_params={'ensure_ascii': False})
return JsonResponse({'msg': '修改失败!无指定编号!'}) def delete(self, request, pk):
target_book_queryset = Books.objects.filter(pk=pk)
if target_book_queryset:
target_book_queryset.delete()
return JsonResponse({})
return JsonResponse({'msg':'删除失败!无指定编号!'})
import json from django.shortcuts import render # Create your views here.
from django.views import View
from .models import Books
from django.http import JsonResponse class BookViews(View):
def get(self, request):
book_all_queryset = Books.objects.all()
book_data_list = [{'pk': book_queryset.pk,
'name': book_queryset.name,
'price': book_queryset.price,
'publish': book_queryset.publish}
for book_queryset in book_all_queryset]
return JsonResponse(book_data_list, safe=False, json_dumps_params={'ensure_ascii': False}) def post(self, request):
new_book_obj = Books.objects.create(name=request.POST.get('name'),
price=request.POST.get('price'),
publish=request.POST.get('publish'))
new_book_dict = {
'name': new_book_obj.name,
'price': new_book_obj.price,
'publish': new_book_obj.publish
}
return JsonResponse(new_book_dict, safe=False, json_dumps_params={'ensure_ascii': False}) class BookViews_1(View):
def get(self, request, pk):
book_queryset = Books.objects.filter(pk=pk).first()
if book_queryset:
book_data_dict = {
'name': book_queryset.name,
'price': book_queryset.price,
'publish': book_queryset.publish
}
return JsonResponse(book_data_dict, safe=False, json_dumps_params={'ensure_ascii': False})
return JsonResponse({'msg': '查询失败!无指定编号!'}) def put(self, request, pk):
target_book_queryset = Books.objects.filter(pk=pk).first()
if target_book_queryset:
book_data_dict = json.loads(request.body)
setattr(target_book_queryset, 'name', book_data_dict.get('name'))
setattr(target_book_queryset, 'price', book_data_dict.get('price'))
setattr(target_book_queryset, 'publish', book_data_dict.get('publish'))
# target_book_queryset.name = book_data_dict.get('name')
# target_book_queryset.price = book_data_dict.get('price')
# target_book_queryset.publish = book_data_dict.get('publish')
target_book_queryset.save() book_data_dict = {
'name': target_book_queryset.name,
'price': target_book_queryset.price,
'publish': target_book_queryset.publish
}
return JsonResponse(book_data_dict, safe=False, json_dumps_params={'ensure_ascii': False})
return JsonResponse({'msg': '修改失败!无指定编号!'}) def delete(self, request, pk):
target_book_queryset = Books.objects.filter(pk=pk)
if target_book_queryset:
target_book_queryset.delete()
return JsonResponse({})
return JsonResponse({'msg': '删除失败!无指定编号!'})

2、drf的使用

​ drf全称:djangorestframework,能够帮助我们快速实现符合restful规范的接口

版本及安装

  • 版本说明:

    • django当前最新版本4.x
    • drf最新支持到django3.x,最新不支持2.x
  • 安装:

    • 我们使用的django版本为2.x,在安装drf后会自动将django升级到最新版本,如果dango版本是3.x就不会出现自动更新的情况,只需在安装drf重新装会2.x版本即可
    • pip3 install djangorestframework -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/

3、drf编写5个接口

# 使用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),
]
# 两个列表相加
urlpatterns += router.urls

四、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)

django框架之drf:2、restful规范,序列、反序列化,drf安装及使用(django原生接口及drf接口编写)的更多相关文章

  1. DRF之restful规范、Postman接口测试

    一. DRF简介 Django REST框架是一个功能强大且灵活的工具包,用于构建Web API. 使用REST框架的一些原因: 该网站可浏览API是你的开发人员一个巨大的可用性胜利. 身份验证策略包 ...

  2. 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用

    一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...

  3. django中的restful规范

    基于django的原生restful规范 主路由:url.py from django.conf.urls import url, include from django.contrib import ...

  4. DRF框架之使用Django框架完成后端接口(API)的定义

    学习DRF框架,首先我们就需要明白为什么要学习这个框架. 接下来我们就先用原生的Django框架来定义一个符合RESTful设计方法的接口(API). RESTful接口的需求如下: GET /boo ...

  5. 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

  6. Django框架 之 modelform组件

    Django框架 之 modelform组件 浏览目录 创建mldelform 添加记录 编辑记录 Django框架中的modelform组件 通过名字我们可以看出来,这个组件的功能就是把model和 ...

  7. 四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

  8. Django框架的安装与使用

    Django框架的安装与使用 在使用Django框架开发web应用程序时,开发阶段同样依赖wsgiref模块来实现Server的功能,我们使用Django框架是为了快速地开发application, ...

  9. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  10. DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render

    DRF框架    全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...

随机推荐

  1. 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

    前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...

  2. .net 温故知新:【8】.NET 中的配置从xml转向json

    一.配置概述 在.net framework平台中我们常见的也是最熟悉的就是.config文件作为配置,控制台桌面程序是App.config,Web就是web.config,里面的配置格式为xml格式 ...

  3. SpringCloud(六) - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

    1.安装erlang语言环境 1.1 创建 erlang安装目录 mkdir erlang 1.2 上传解压压缩包 上传到: /root/ 解压缩# tar -zxvf otp_src_22.0.ta ...

  4. ARM TrustZone白皮书部分阅读

    嵌入式系统安全的一些解决方法及缺陷 外部硬件安全模块:在主SoC之外包含一个专用的硬件安全模块或可信元件,e.g. 手机的SIM卡.隔离仅限于可以从非易失性存储器运行的相对静态程序 内部硬件安全模块: ...

  5. GNN 101

    GNN 101 姚伟峰 http://www.cnblogs.com/Matrix_Yao/ GNN 101 Why Graph无处不在 Graph Intelligence helps It's t ...

  6. C#与Halcon联合编程之用PictureBox控件替代HWindowControl控件

    在使用HALCON和C#联合编程,有时候要使用halcon的HWindowControl控件,但是我发现,HWindowControl的图片显示控件,不能使用GDI+绘制ROI,不知道为什么,反正我测 ...

  7. Hutool 的学习

    1. Hutool 介绍 Hutool 是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜 ...

  8. .NET二叉树,递归和迭代遍历二叉树

    代码随想录: https://programmercarl.com .NET中二叉树的定义 public class TreeNode { public int val; public TreeNod ...

  9. Go语言核心36讲44

    今天,我们来讲另一个与I/O操作强相关的代码包bufio.bufio是"buffered I/O"的缩写.顾名思义,这个代码包中的程序实体实现的I/O操作都内置了缓冲区. bufi ...

  10. Redux 的困扰与如何技术选型

    文章的名字我想了很久,备选项有"我再不推荐 Redux","Redux 为什么令我头疼","Redux 进化启示录"等等.通过这一系列名字我 ...