1.restful规范

REST全称是Representational State Transfer,中文意思是表述:表征性状态转移,它首次出现在2000年Roy Fielding的博士论文中。RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。

restful规范(10条):
1.数据的安全保障,通常使用https(http+ssl/tsl)协议。
-url链接一般采用
-采用https协议,可以提高数据交互过程中的安全性 2.接口中带api标识:
-https://api.zkz.com/books
-https://www.zkz.com/api/books(一般采用这种) 3.多版本共存,路径中带版本信息:可以在版本前面跟v,也可以直接写数字
-https://www.zkz.com/api/v1/books
-https://www.zkz.com/api/2/books 4.数据即是资源,均使用名词,尽量不要出现动词
-接口一般都是完成前后数据的交互,交互的数据我们称为资源
-一般接口形式如下:
https://api.baidu.com/users
https://api.baidu.com/books
-特殊的接口可以出现动词,因为这些接口一般没有一个明确的资源,或者动词就是接口的核心含义:https://api.baidu.com/login 5.资源后缀固定,资源操作由请求方式决定。
-操作资源一般都涉及到增删改查,我们提供请求方式来标识增删改查动作:
https://api.baidu.com/books:get请求,获取所有图书
https://api.baidu.com/books/1:get请求:获取主键为1的图书
https://api.baidu.com/books:post请求:新增一本图书
https://api.baidu.com/books/1:put请求:修改主键为1的书
https://api.baidu.com/books/1:delete请求:删除主键为1的书 6.在请求地址中带过滤条件:
https://api.baidu.com/books?name=红&price=99 7.响应状态码:
http响应状态码:
1xx:请求正在处理
2xx:成功响应(200:请求成功,201:创建成功)
3xx:301:临时重定向;302:永久重定向
4xx:403:无权访问;404:请求资源不存在
5xx:服务器内部错误(服务端问题与客户端无关)
公司内部响应状态码,放在响应体中:
{code:0} 8.返回的数据中带错误信息:
{
"code":0,
"msg":"用户名错误"
} 9.返回的结果应该符合以下规范(很多公司不遵循该规范)
GET获取所有数据:返回资源对象的列表(列表套字典),eg:[{name:红楼梦,price:99},{name:红楼梦,price:99},{name:红楼梦,price:99}]
GET获取单个对象:返回单个资源对象:{name:红楼梦,price:99}
POST新增对象:返回新生成的资源对象:{name:西游记,price:99}
PUT修改对象:返回完整的资源对象:{name:西游记,price:100}
DELETE删除:返回一个空文档 10.响应数据带链接:
{
"name":"肯德基(罗餐厅)",
"img": "https://image.baidu.com/kfc/001.png"
}

2.序列化和反序列化

api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把【数据转换格式】,序列化可以分两个阶段:
1.序列化:把我们识别的数据转成指定的格式提供给别人。
"""
例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。把数据从数据库中拿出来,再传给前端,也是一个read的过程。
"""
2.反序列化:把别人提供的数据转换/还原成我们需要的格式。
"""
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。反序列化是一个write的过程。
"""

3.基于django原生编写5个接口

1.以后写的接口,都是以下5个接口及其变形:
查询一个
查询所有
新增一个
修改一个
删除一个 2.思路:
创建book表
表迁移
录入数据(直接录)
写查询的接口(遵循restful规范,使用cbv) 3.查询所有图书:
views中代码:
from django.views import View class BookView(View):
def get(self,request):
book_queryset = Book.objects.all()
# 不能直接将book_queryset传到前端,因为queryset只能序列化字典、列表需要加一个参数:safe=false
book_list = []
for book_obj in book_queryset:
book_list.append({'name':book_obj.name,'price':book_obj.price,'publish':book_obj.publish})
"""
print(book_list) # [{'name': '西游记', 'price': '99', 'publish': '北京出版社'}, {'name': '红楼梦', 'price': '88', 'publish': '南京出版社'}]
查看得知book_list此时是列表套字典的数据类型,该类型可以被序列化
"""
return JsonResponse(book_list,safe=False,json_dumps_params={'ensure_ascii':False})
# 通过查看源码得知,想要传字典以外的数据类型需要将safe改成False,如果想在网页上转码成中文,需要上传ensure_ascii=False,但是不能直接上传,需要用参数json_dumps_params包起来 4.增加:
views中代码:
from django.views import View class BookView(View):
def get(self,request):
book_queryset = Book.objects.all()
# 不能直接将book_queryset传到前端,因为queryset只能序列化字典、列表需要加一个参数:safe=false
book_list = []
for book_obj in book_queryset:
book_list.append({'name':book_obj.name,'price':book_obj.price,'publish':book_obj.publish})
"""
print(book_list) # [{'name': '西游记', 'price': '99', 'publish': '北京出版社'}, {'name': '红楼梦', 'price': '88', 'publish': '南京出版社'}]
查看得知book_list此时是列表套字典的数据类型,该类型可以被序列化
"""
return JsonResponse(book_list,safe=False,json_dumps_params={'ensure_ascii':False}) def post(self, request): # 需要将csrf注掉 name = request.POST.get('name')
price = request.POST.get('price')
publish = request.POST.get('publish')
# print(name,price,publish)
# 在此处用postman提交post请求并且携带数据,只能使用body模式下的form-data以及urlencoded
book_obj = Book.objects.create(name=name,price=price,publish=publish)
return JsonResponse({'name':book_obj.name,'price':book_obj.price,'publish':book_obj.publish})
用urlencoded传数据:

用form-data传数据:

"""
用JSON传数据:JSON传数据只能用request.body来接收,并且接收到的数据是二进制格式,需要用json.loads(request.body)来转码(json.loads本身就有解码二进制类型的功能,并且还可以将json格式反序列化)。
"""
views中代码:
from django.views import View class BookView(View):
def post(self, request):
book_dict = json.loads(request.body) # {'name': '三国演义', 'price': 99, 'publish': '北京出版社'}
book_obj = Book.objects.create(**book_dict)
return JsonResponse({'name':book_obj.name,'price':book_obj.price,'publish':book_obj.publish})

5.查看指定图书信息:查看指定图书,修改,删除都需要上传主键,所以这些功能需要重新开一个路由:
ulr.py:
urlpatterns = [
path('admin/', admin.site.urls),
path('app01/v1/books/',views.BookView.as_view()),
path('app01/v1/books/<int:pk>',views.BookDetailView.as_view()),
] views.py:
class BookDetailView(View):
def get(self,request,pk):
book_obj = Book.objects.filter(pk=pk).first()
return JsonResponse({'pk':book_obj.pk,'name':book_obj.name,'price':book_obj.price,'publish':book_obj.publish})

6.修改图书数据:
views.py:
class BookDetailView(View):
def put(self,request,pk):
# 拿到图书对象
book_obj = Book.objects.filter(pk=pk).first()
# 将json格式的字典转换成python数据类型的字典
book_dict = json.loads(request.body)
# print(book_dict) # {'name': '三国演义', 'price': 99, 'publish': '北京出版社'} 然后修改对象属性
book_obj.name = book_dict.get('name')
book_obj.price = book_dict.get('price')
book_obj.publish = book_dict.get('publish')
book_obj.save() # 别忘记保存 return JsonResponse({'pk':book_obj.pk,'name':book_obj.name,'price':book_obj.price,'publish':book_obj.publish}) """
postman中用body模式下报的json格式发送数据。
"""

7.删除图书数据:
views.py:
class BookDetailView(View):
def delete(self,request,pk):
Book.objects.filter(pk=pk).delete()
# 返回一个空字典
return JsonResponse(data={})

4.drf介绍和快速使用

djangorestframework:drf,帮助我们快速的实现符合restful规范的接口
"""
django最新版本为:4.x,一般都会用最新版的上一版3.x
drf最新支持到djagno3.x,最新不支持django2.x。
"""
安装drf:pip3 install djangorestframework -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/
# 如果安装了最新的drf,由于你是django2.x 它发现它不支持,它会自动写在dajgno,安装最新的django 4.x 使用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

5.cbv源码分析

1.当我们在视图层写cbv时,在路由层需要用视图类点as_views(),说明as_views()是视图类或者其父类的一个方法,并且该方法是绑定给类的。
经查找发现视图类BookView中没有该方法,再去其父类View中查找,发现有方法as_view(),并且该方法被@classonlymethod修饰,累调用会将自身当做参数传入,所以我们在路由层用类名点该方法不用传参。

2.经查看,as_views()的返回值是view,所以views.BookView.as_views()的结果相当于views.view。
所以视图类(cbv)的本质还是视图函数(fbv)。正好在as_views()方法中,有一个view()方法,对于这个方法我们只需要知道它的返回值是self.dispatch(),self是是视图类产生的对象:

3.在视图函数类的父类View中,存在一个dispatch方法,self依旧是视图类的一个对象:
def dispatch(self, request, *args, **kwargs):
# http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
"""
getattr()中有三个参数,self.http_method_not_allowed是如果找不到执行的结果。这句代码和else handler = self.http_method_not_allowed效果一样。
"""
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
如果request.method.lower()是http_method_names当中的一个方法,利用反射handler就可以拿到该名字,然后将该名字加括号返回,就可以执行该方法。

drf-restful规范、django原生编写接口的更多相关文章

  1. django rest framework restful 规范

    内容回顾: . django请求生命周期 -> 执行遵循wsgi协议的模块(socket服务端) -> 中间件(路由匹配) -> 视图函数(业务处理:ORM.模板渲染) -> ...

  2. day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能

    目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...

  3. RESTful规范与django编写restful接口

    一.什么是RESTful规范 ①REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” ②REST从资 ...

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

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

  5. 接口、RESTful规范、DRF

    接口 #接口:url连接,通过向链接发送不同的类型请求与参数得到相应的响应数据 #1.在视图书写处理请求的 视图函数 #2.在路由层为视图函数配置 url链接=>产生接口 #3.前台通过ajax ...

  6. django中的restful规范

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

  7. DRF cbv源码分析 restful规范10条 drf:APIView的源码 Request的源码 postman的安装和使用

    CBV 执行流程 路由配置:url(r'^test/',views.Test.as_view()),  --> 根据路由匹配,一旦成功,会执行后面函数(request) --> 本质就是执 ...

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

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

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

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

  10. Django框架(十七)-- CBV源码分析、restful规范、restframework框架

    一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view) 2.as_view方法 as_view是 ...

随机推荐

  1. 【操作说明】全能型H.265播放器如何使用?

    本播放器集成了公司业务的接口,包含了实播,回放,云台控制和回放速度控制,截图和全屏功能可以根据type直接初始化接口地址如果是第三方业务对接,也可以单独配置接口地址 正确使用H.265播放器需要按以下 ...

  2. 镜像制作工具diskimage-builder介绍

    简介 diskimage-builder(简称dib)是一款用于构建系统镜像的工具,它被设计用于OpenStack的TripleO项目,支持qocw2.vhd.raw等主流镜像格式. 在众多系统镜像构 ...

  3. Java实现Excel批量导入数据库

    场景说明 在实际开发中,经常需要解析Excel数据来插入数据库,而且通常会有一些要求,比如:全部校验成功才入库.校验成功入库,校验失败返回提示(总数.成功数.失败数.失败每行明细.导出失败文件明细-) ...

  4. hashlib加密模块 subprocess模块 logging日志模块

    目录 hashlib加密模块 简介 hashlib使用流程 hashilb加密模块使用说明 明文绑定密文 密文长度不变 多次传入 密文不可解密原因 加盐处理(salt) 普通加盐 动态加盐 加密实际运 ...

  5. Jmeter 函数助手之__UUID 生成唯一的标识符

    在测试ws协议接口时,常常需要传入唯一标识符,jmeter 提供__UUID.__Random生成随机的字符串,两者区别为:__UUID生成的随机字符串不会重复,而__Random会重复 __UUID ...

  6. cs231n__5.1/5.2 CNN

    CS231n note 5.1 CNN_history now: 略 5.2 CNN 上节课我们谈到了全连接层的概念: 对于全连接层而言,我们要做的就是在这些向量上进行操作. 例如: 但是至于卷积层, ...

  7. python之路40 前端之 CSS 标签查询

    表单标签的补充说明 基于form表单发送数据 1.用于获取用户数据的标签至少应该含有name属性 name属性相当于字典的键 用户输入的数据会被保存到标签的value属性中 value属性相当于字典的 ...

  8. NoClassDefFoundError的两种情况

    ClassNotFoundException vs. NoClassDefFoundError ClassNotFoundException 关于ClassNotFoundException发生的原因 ...

  9. pytest框架的简介

    概念:是一款基于python语言的单元测试框架 用途:用于发现测试用例.执行测试用例.判断测试结果.生成测试报告的一款框架 测试用例的规则: 测试文件必须与test开头,或_test结尾 类文件必须T ...

  10. YMOI 2019.6.15

    题解 YMOI 2019.6.15 前记 NOIP信心个蛋赛,被各路大佬吊打,信心-- 耻辱墙: \(2019.6.15\) \(rank\) \(\color{red}{3}\) T1 简单队列 题 ...