我们以在Django框架中使⽤的频道- 类别案例来写⼀套⽀持类别数据增删改查的REST API接⼝,来理解REST API的开发。
前后端传值都是JSON格式数据。
创建视图
import json
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from django.views.generic.base import View
# Create your views here.
from app1.models import NewsChannel
class ChannelsAPIView(View):
def get(self, request):
'''
GET /channels/
查询所有的频道信息
:param request:
:return:
'''
channel_queryset = NewsChannel.objects.all()
channel_list = []
for channel in channel_queryset:
channel_list.append({
'id': channel.id,
'name': channel.name,
'url': channel.url
})
return JsonResponse(channel_list,safe=False)
def post(self,request):
'''
POST /channels/
新增频道信息
:param request:
:return:
'''
#接收前端传递过来的参数
params=request.body
#校验参数
if not params:
return JsonResponse({'errormsg':'请求参数有误'})
#将bytes类型转换为json格式的数据
params_str=params.decode()
#将str转换成dict歌颂数据
params_dict=json.loads(params_str)
#入库操作
channel=NewsChannel.objects.create(name=params_dict.get('name'),
url=params_dict.get('url'))
#响应结果
return JsonResponse({
'id': channel.id,
'name': channel.name,
'url': channel.url
},status=201)
class ChannelAPIView(View):
def get(self,request,pk):
'''
GET /channels/pk/
#查询频道详细信息
:param request:
:param pk:
:return:
'''
try:
channel=NewsChannel.objects.get(pk=pk)
except NewsChannel.DoesNotExist:
return HttpResponse(status=404)
return JsonResponse({
'id': channel.id,
'name': channel.name,
'url': channel.url
},status=201)
def put(self,request,pk):
'''
PUT /channels/pk/
修改某条数据
:param request:
:return:
'''
try:
channel=NewsChannel.objects.get(pk=pk)
except NewsChannel.DoesNotExist:
return HttpResponse(status=404)
params = request.body
if not params:
return JsonResponse({'errormsg':'缺少必传参数'})
params_str=params.decode()
params_dict=json.loads(params_str)
channel.name=params_dict.get('name','')
channel.url=params_dict.get('url','')
channel.save()
return JsonResponse({
'id': channel.id,
'name': channel.name,
'url': channel.url
}, status=201)
def delete(self,request,pk):
'''
DELETE /channels/pk/
删除某条频道数据
:param request:
:return:
'''
try:
channel=NewsChannel.objects.get(pk=pk)
except NewsChannel.DoesNotExist:
return HttpResponse(status=404)
channel.delete()
return HttpResponse(status=204)
注册路由
根路由
from django.contrib import admin
from django.urls import path,re_path,include
urlpatterns = [
path('admin/', admin.site.urls),
re_path('^',include('app1.urls'))
]
子路由
from django.urls import path,re_path
from . import views
urlpatterns=[
re_path('^channels/$',views.ChannelsAPIView.as_view()),
re_path('^channels/(?P<pk>\d+)/$',views.ChannelAPIView.as_view())
]
测试
DRF开发REST接⼝步骤
在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增、删、改、查的实现流程基本套路化,所以这部分代码也是可以复⽤简化编写的:
增:校验请求数据 -> 执⾏反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
删:判断要删除的数据是否存在 -> 执⾏数据库删除
改:判断要修改的数据是否存在 -> 校验请求的数据 -> 执⾏反序列化过程 ->保存数据库 -> 将保存的对象序列化并返回
查:查询数据库 -> 将数据序列化并返回
反序列化:将json格式的数据转化成模型类对象数据
序列化:将模型类对象数据转化成json格式的数据
DRF 特点
提供了定义序列化器Serializer的⽅法,可以快速根据 Django ORM 或者其它库⾃动序列化/反序列化;
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
丰富的定制层级:函数视图、类视图、视图集合到⾃动⽣成 API,满⾜各种需要;
多种身份认证和权限认证⽅式的⽀持;
内置了限流系统;
直观的 API web 界⾯;
可扩展性,插件丰富
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123289.html