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. 深度优先搜索(Depth-First-Search)dfs代码模板

    void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据需求添加 return; } if(越界或者是不合法状态) return; if(特殊状态)//剪枝,去除一些不需 ...

  2. webscraper 无代码爬虫

    官网:https://www.webscraper.io/web-scraper-first-time-install webscraper 简介 Web Scraper 是一款免费的,适用于普通用户 ...

  3. ES6 学习笔记(二)解构赋值

    一.数组的解构赋值 1.基本用法 ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,该操作即为解构 如: let [a,b,c]=[1,2,3]; console.log(a,b,c) ...

  4. day08-XML

    XML 官方文档:https://www.w3school.com.cn/xml/index.asp 1.为什么需要xml? 需求1:两个程序间进行数据通信? 需求2:给一台服务器,做一个配置文件,当 ...

  5. FastApi学习1

    先写路由文件: 其次通过ORM操作数据库相关:

  6. C#自定义控件(3)—PanelHead控件

    有时候我们会需要这样一种控件效果,上面是标题,下面是另外一个区域,且分别需要设置不同的颜 色等,当然我们可以使用splitContainer控件来制作,也可以直接使用自定义控件来,这样可以减少一 定的 ...

  7. 2022春每日一题:Day 11

    题目:高斯消元法 高斯消元法是一个模板,下面简单介绍其内容以及实现方法. 高斯消元是求一个求多元一次方程组的解的算法. 就是形式如下的关于x1,x2...xn的方程组的解. a11x1 + a12x2 ...

  8. 图文详解在VMware Workstation 16 PRO虚拟机上安装Rocky 8.6 linux系统

    一.安装VMware Workstation虚拟机 下载VMware Workstation 16 PRO虚拟机 https://www.vmware.com/cn/products/workstat ...

  9. python实现图片转换pdf

    安装第三方库 linux平台 sudo apt install python3-reportlab python3-pil 示例代码 import sys from reportlab.pdfgen ...

  10. 【每日一题】【树的dfs递归,返回多次,注意都遍历完后才最终返回】2022年1月6日-112. 路径总和

    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum .判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 tr ...