前言
REST不是什么软件或者代码,而是一种思想,现在流行前后端分离开发项目,一般使用json交互数据,写过前端页面的都知道,只要哪怕页面中的数据有一丝丝变动,那整个页面都需要重新渲染,这对性能无疑是巨大的浪费,并且页面中只有一些元素会和数据相联系,
比如列表中的 元素,如果数据有变化,能直接只更新
元素就好了,REST 就是为此而生。
REST简介
什么是RESTful面向资源?
看REST是什么意思,英文Representational state transfer 表述性状态转移 其实就是对 资源 的表述性状态转移。
简单的说:RESTful是一种架构的规范与约束、原则,符合这种规范的架构就是RESTful架构。
资源的地址 在web中就是URL (统一资源标识符)
资源是REST系统的核心概念。 所有的设计都是以资源为中心
结合项目怎么识别资源
1.商品加入购物车 购物车
2.提交订单 订单
3.创建用户 用户
围绕资源进行 添加,获取,修改,删除,以及对符合特定条件的资源进行列表操作 ,针对资源设计接口。
关于规范与约束有哪些?
RESTful 架构的核心规范与约束:统一接口
分为四个子约束:
1.每个资源都拥有一个资源标识,每个资源的资源标识可以用来唯一地标明该资源
2.消息的自描述性
3.资源的自描述性。
4.HATEOAS Hypermedia As The Engine Of Application State(超媒体作为应用状态引擎)
即客户只可以通过服务端所返回各结果中所包含的信息来得到下一步操作所需要的信息,如到底是向哪个URL发送请求等。
也就是说,一个典型的REST服务不需要额外的文档标示通过哪些URL访问特定类型的资源,而是通过服务端返回的响应来标示到底能在该资源上执行什么样的操作
目的:实现客户端无需借助任何文档即能调用到所有的服务器资源
url设计规范
HTTP常见的请求协议类型:GET,POST,DELETE,PUT,PATCH,OPTION,HEAD,TRACE.
以前使用的url设计大部分都是这样:
不符合RESTFUL的风格,RESTFUL风格的url设计:
View与APIView区别
View是django默认的视图函数,APIView是REST framework 提供的所有函数的基类,继承自django的View.APIView与View的不同之处:
1.传入到视图方法中的REST framework的Request对象,而不是django的HttpRequest对象;
2.视图方法可以返回REST framework的Response对象,试图会为相应数据设置render返回符合前端要求的格式。
3.任何APIException都可以被捕捉获取到,并且处理成合适的响应信息:APIException异常捕获
4.在进行dispath()分发前,会对请求身份进行身份认证,权限检查,流量控制。
APIView多了一些属性方法,比如:身份认证,权限检查,流量控制。
authentication_classes 身份认证
permission_classes 权限检查
throttle_classes 流量控制
模块安装
先安装对应模块
pip install djangorestframework
pip install django-filter
在settings.py APP中加入对应的模块
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'login', 'captcha', 'restframework', ]
Models.py设计
class Card(models.Model): card_id = models.IntegerField(verbose_name="卡号") card_user = models.CharField(verbose_name='姓名',max_length=128) add_time = models.DateTimeField(verbose_name='日期',auto_now_add=True) class Meta: verbose_name = '银行卡账户' verbose_name_plural = '银行卡账户信息' def __str__(self): return self.card_id
vies.py 设计
首先定义序列化数据类,继承 rest_framework序列化基类,序列化显示model的所有字段。
定义CardListAPIView,get查询数据,post提交创建数据。
from rest_framework import serializers from . import models class CardAPISerializer(serializers.ModelSerializer): '''序列化数据的类,根据model表来获取字段''' class Meta: model = models.Card fields = '__all__' # fields = ('card_id','card_user')
from rest_framework.views import APIView from . import models from rest_framework.response import Response from rest_framework import serializers class CardListAPIView(APIView): '''REST framework的APIView实现获取card列表 ''' '''return list of all user''' def get(self, request, format=None): cards = models.Card.objects.all() serializer = CardAPISerializer(cards,many=True) return Response({"code":0, "msg":"查询成功", "data":serializer.data}) def post(self,request,format=None): '''create Card 反序列化''' verify_data = CardAPISerializer(data=request.data) # 只改这里 if verify_data.is_valid(): # 判断数据是否合法 verify_data.save() return Response({"code": 0, "msg": "创建成功", "data": request.data}) else: return Response({"code": 0, "msg": "创建成功", "data":'request data invaild %s'% verify_data.errors})
创建数据库表:
python manage.py makemigrations
python manage.py migrate
启动接口
启动接口:python manage.py 127.0.0.0.1:8000
get请求接口:
浏览器输入网址:http://127.0.0.1:8000/api/v1/cardlist
post请求接口:
request截图:
response截图: