目录
此篇对《连接mysql8.0数据库》编写成json的项目改写成drf方式。
需要的知识点,是drf官方教程tutorial所有内容。
还有旁边的api导读(API Guide)中的视图相关
一、django用drf改写思路
把普通的django返回的json变成drf方式思路如下:
1. 序列化serializers:我们使用drf框架中的序列化serializers,而不是django的,主要是把python数据类型转为json
2.视图APIView视图集viewsets:drf使用的是基于类的视图,我这里先使用apiView中的@api_view()修饰器,写在函数顶部,表示这是一个drf的APIView而不是django的view.
3.url配置路由route:这个功能主要是关联类(视图集),而django是的url则是联系到函数。
我这里使用的是函数,并不是类,所以没有用到route。
4.其它,权限之类我没添加,去掉。分页功能是可选的,我添加了。
二、重构django代码
使用了drf框架对之前《连接mysql8.0数据库》进行重写,操作如下:
2.1 django安装及配置
安装及配置是按照《django REST framework(drf)的安装》进行安装的,我这里不不再详说了。
2.2 创建drf序列化
我在app中创建一个名为serializers.py文件,内容如下:
from rest_framework import serializers
from app.models import Stu
class StudentSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model=Stu
fields = '__all__'
2.3 使用视图集APIView
REST framework提供了一个APIView类,它是Django的View类的子类。
APIView类和一般的View类有以下不同:
- 被传入到处理方法的请求不会是Django的HttpRequest类的实例,而是REST framework的Request类的实例。
- 处理方法可以返回REST framework的Response,而不是Django的HttpRequest。视图会管理内容协议,给响应设置正确的渲染器。
- 任何APIException异常都会被捕获,并且传递给合适的响应。
- 进入的请求将会经过认证,合适的权限和(或)节流检查会在请求被派发到处理方法之前运行。
使用APIView类和使用一般的View类非常相似,通常,进入的请求会被分发到合适处理方法比如.get(),或者.post。另外,很多属性会被设定在控制API策略的各种切面的类上。
app/views.py代码修改如下:
import json
from rest_framework.decorators import api_view
from app.models import Stu
from app.serializers import StudentSerializer
@api_view()
def findStuBySid(request, stuSid):
querysets = Stu.objects.filter(sid=stuSid)
# 可以序列化查询结果集(querysets)而不是模型实例。
# 我们只需要为serializer添加一个many=True标志。
serializer = StudentSerializer(querysets, many=True)
# 结果为有序列字典,只有一个结果,所以取第1个
#[{"id": 11, "sid": "011", "name": "fly", "yuWen": "90.0", "shuXue": "89.0"}]
res = json.dumps(serializer.data[0])
return HttpResponse(res)
上面中用到的是结果集,所以要用到many=Ttrue,如果我们只查一条记录,其实可以使用get的,所以我修改一下,代码变成:
@api_view()
def findStuBySid(request, stuSid):
querysets = Stu.objects.get(sid=stuSid)
# 可以序列化查询结果集(querysets)而不是模型实例。
# 我们只需要为serializer添加一个many=True标志。
serializer = StudentSerializer(querysets)
res = json.dumps(serializer.data)
print(serializer.data)
return HttpResponse(res)
2.4 添加url映射
app/urls.py添加内容
path('sid/<str:stuSid>', views.findStuBySid, name='stuBySid'),
三、运行效果
运行django,在浏览器中输入 http://127.0.0.1:8000/sid/001,效果如下:
PS:最后没有反斜杠的,不能写成 http://127.0.0.1:8000/sid/001/,否则会报404