Django REST framework框架之GET, POST, PUT, PATCH, DELETE等API请求接口设计

一、API接口功能需求:设计一些接口URL,让前端/客户请求这个URL去获取数据并显示,更改数据(增删改查),达到前后端分离的效果

二、设计逻辑:通过http协议请求方式GET、POST、PUT、PATCH、DELETE设计符合RESTful规范的api接口也就是URL

三、简易源码:

  1. 路由代码
    总路由:
    urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/',include('appname.urls')),
    ]
    子路由:
    urlpatterns = [
    path('articles/',views.article_list,name='article_list'),
    path('articles/',views.article_detail,name='article_detail'),
    ]

  2. 模型类models
    class Article(models.Model):
    tit = models.CharField(verbose_name='标题',max_length=100)
    vum = models.IntegerField(verbose_name='浏览量')
    content = models.TextField(verbose_name='内容')

3.序列化serializers
#导入模型类和rest_framework序列化模块serializers
from .models import Article
from rest_framework import serializers

#定义序列化类,使用继承ModelSerializer方法
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article #指定序列化的模型类
fields = '_all_' #选取序列化字段,此处可自行选取字段

4.视图函数views
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from .models import Article
from .serializers import ArticleSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
#调用csrf装饰器csrf_exempt模块,解决跨域访问问题
#JSONRenderer它将Python的dict转换为JSON返回给客户端
#JSONParser 负责将请求接收的JSON数据转换为dict

#写法一
#在需要跨域的视图上调用装饰器@csrf_exempt
@csrf_exempt
def article_list(request):
if request.method == 'GET':
arts = Article.objects.all() #获取模型类数据
ser = ArticleSerializer(instance=arts,many=True) #序列化数据instance
#下一步用rest_framework方法里的JSONRenderer方法渲染数据
json_data = JSONRenderer().render(ser.data)
return HttpResponse(json_data,content_type='application/json',status=200)

elif request.method == 'POST':
    data = JSONParser().parse(request) #把前端的request里json数据解析转成python的数据类型
    ser = ArticleSerializer(data=data) #data=反序列化
    if ser.is_valid():
        ser.save()
        json_data = JSONRenderer().render(ser.data)
        return HttpResponse(json_data, content_type='application/json', status=201)
    json_data = JSONRenderer().render(ser.errors)
    return HttpResponse(json_data, content_type='application/json', status=400)

#写法二
class JSONResponse(HttpResponse):
def _init(self,data,**kwargs):
content = JSONRenderer().render(data)
kwargs['content_type'] = 'application/json'
super(JSONResponse, self)._init
(content,**kwargs)

#根据id进行增删改操作接口
@csrf_exempt
def article_detail(request,id):
try:
art = Article.objects.get(id=id)
except Article.DoesNotExist as e:
return HttpResponse(status=404)

if request.method == 'GET':
    ser = ArticleSerializer(instance=art)
    return JSONResponse(ser.data,status=200)

elif request.method == 'PUT':
    data = JSONParser().parse(request)
    ser = ArticleSerializer(instance=art,data=data) #首先传实例再传数据,更新肯定有实例
    if ser.is_valid(): #判断更新校验
        ser.save()
        return JSONResponse(ser.data,status=201)
    return JSONResponse(ser.errors,status=404)  #如果数据校验失败,直接返回错误

elif request.method == 'PATCH':
    data = JSONParser().parse(request)
    ser = ArticleSerializer(instance=art,data=data,partial=True)
    if ser.is_valid():
        ser.save()
        return JSONResponse(ser.data,status=201)
    return JSONResponse(ser.errors,status=404)

elif request.method == 'DELETE':
    art.delete()
    return HttpResponse(status=204)

备注:
*写法二中定义JSONResponse类将返回的数据data与content_type返回类型做了封装
*API接口
GET/POST
http://127.0.0.1/api/articles
GET/PUT/PATCH/DELETE
http://127.0.0.1/api/articles/1
*Postman测试效果图

GET.png

POST.png

PUT.png

DELETE.png

你可能感兴趣的:(Django REST framework框架之GET, POST, PUT, PATCH, DELETE等API请求接口设计)