一、API接口功能需求:设计一些接口URL,让前端/客户请求这个URL去获取数据并显示,更改数据(增删改查),达到前后端分离的效果
二、设计逻辑:通过http协议请求方式GET、POST、PUT、PATCH、DELETE设计符合RESTful规范的api接口也就是URL
三、简易源码:
-
路由代码
总路由:
urlpatterns = [
path('admin/', admin.site.urls),
path('api/',include('appname.urls')),
]
子路由:
urlpatterns = [
path('articles/',views.article_list,name='article_list'),
path('articles/<int:id>',views.article_detail,name='article_detail'),
] -
模型类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测试效果图




网友评论