python测试开发django-rest-framework-59.restful接口开发
前言
REST 不是什么具体的软件或者代码,而是一种思想。现在流行前后端分离开发项目,一般用 json 来交换数据。
相信写过模板的同学都知道,只要哪怕页面中的数据有一丝丝变动,那整个页面都需要重新渲染,这对性能无疑是巨大的浪费,并且页面中只有一些元素会和数据相联系,
比如列表中的 <li>
元素,如果数据有变化,能直接只更新 <li>
元素就好了,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访问特定类型的资源,而是通过服务端返回的响应来标示到底能在该资源上执行什么样的操作
目的:实现客户端无需借助任何文档即能调用到所有的服务器资源
基本实现
先安装对应的模块
pip install djangorestframework
pip install django-filter
在setting.py中加入配置参数
INSTALLED_APPS = (
...
'rest_framework',
)
models.py
class Card(models.Model):
'''银行卡 基本信息 # 作者:上海悠悠,QQ交流群:750815713'''
card_id = models.CharField(max_length=30, verbose_name="卡号", default="")
card_user = models.CharField(max_length=10, verbose_name="姓名", default="")
add_time = models.DateField(auto_now=True, verbose_name="添加时间")
class Meta:
verbose_name_plural = '银行卡账户'
verbose_name = "银行卡账户_基本信息"
def __str__(self):
return self.card_id
views.py
from rest_framework import viewsets
from rest_framework import serializers
from .models import *
from django.http import QueryDict
from rest_framework.request import Request
def get_parameter_dic(request, *args, **kwargs):
# 作者:上海悠悠,QQ交流群:750815713
if isinstance(request, Request) == False:
return {}
query_params = request.query_params
if isinstance(query_params, QueryDict):
query_params = query_params.dict()
result_data = request.data
if isinstance(result_data, QueryDict):
result_data = result_data.dict()
if query_params != {}:
return query_params
else:
return result_data
class CardSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Card
fields = "__all__"
class CardViewSet(viewsets.ModelViewSet):
queryset = Card.objects.all()
serializer_class = CardSerializer
def get(self, request, *args, **kwargs):
params=get_parameter_dic(request)
return JsonResponse(data=params)
def post(self, request, *args, **kwargs):
params=get_parameter_dic(request)
return JsonResponse(data=params)
def put(self, request, *args, **kwargs):
params=get_parameter_dic(request)
return JsonResponse(data=params)
urls.py
from django.conf.urls import include
from hello import views
from rest_framework import routers
from django.conf.urls import url
# 作者:上海悠悠,QQ交流群:750815713
router = routers.DefaultRouter()
router.register(r'cards', views.CardViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
]
测试接口
使用fiddler测试刚才写的接口
get查看数据
发送get请求:http://127.0.0.1:8000/cards/
数据库表里面数据为空
post提交数据
发送post请求:http://127.0.0.1:8000/cards/
提交成功后,查看数据库,会发现新增了一条数据
查看数据
可以多新增几个,查看所有的数据
只查看其中的一条数据,后面加上它的id,http://127.0.0.1:8000/cards/65/
编辑数据
编辑数据,发送put请求,后面接上它的id
删除数据
删除数据,用delete请求,后面接上它的id
删除之后,刚才这个数据就没有了