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. Android开发 对接微信分享SDK总结

    原文:Android开发 对接微信分享SDK总结 - Stars-One的杂货小窝 公司项目需要对接微信分享,本来之前准备对接友盟分享的,但友盟的分享实际参数太多,而我又只需要对接一个微信分享,于是便 ...

  2. 优雅的写好Vue项目代码 — 路由拆分、Vuex模块拆分、element按需加载

    目录 路由的拆分 VUEX模块拆分 Element UI库按需加载的优雅写法 路由的拆分 项目较大路由较多时,路由拆分是一个不错的代码优化方案,按不同业务分为多个模块,结构清晰便于统一管理. requ ...

  3. 写一个shell,自动执行jmeter测试脚本

    贡献一个自己写的shell脚本,很简单,但又可以高效率的自动执行jmeter压测脚本. #!/bin/bash #author:zhangyl #version:V1 #该脚本放置于压测脚本的上一层目 ...

  4. 干货,深入剖析ReentrantLock源码,推荐收藏

    ReentrantLock和Synchronized都是Java开发中最常用的锁,与Synchronized这种JVM内置锁不同的是,ReentrantLock提供了更丰富的语义.可以创建公平锁或非公 ...

  5. 嵌入式-C语言基础:理解形参和实参的区别

    #include<stdio.h> //实参:函数原型中声明函数后面带的参数 int test(int x)//函数原型 { //函数体 printf("test里面的x地址=% ...

  6. js 金钱3位格式化

    function formatCash(str) { return str.split('').reverse().reduce((prev, next, index) => { return ...

  7. 打印菱形-java

    public class WeekendDemo01 { /** 打印菱形 * * * *** * ***** * *** * * */ public static void main(String[ ...

  8. JUC源码学习笔记6——ReentrantReadWriteLock

    系列文章目录和关于我 阅读此文需要有AQS独占和AQS共享的源码功底,推荐阅读: 1.JUC源码学习笔记1--AQS独占模式和ReentrantLock 2.JUC源码学习笔记2--AQS共享和Sem ...

  9. Kubernetes(K8S) 配置管理-ConfigMap 介绍

    作用:存储不加密数据到 etcd,让 Pod 以变量或者 Volume 挂载到容器中 场景:配置文件 创建配置文件 redis.properties redis.host=127.0.0.1 redi ...

  10. 跟我学Python图像处理丨图像分类原理与案例

    摘要:本篇文章将分享图像分类原理,并介绍基于KNN.朴素贝叶斯算法的图像分类案例. 本文分享自华为云社区<[Python图像处理] 二十六.图像分类原理及基于KNN.朴素贝叶斯算法的图像分类案例 ...