Django REST framework--DRF视图
- DRF视图编写
- 常规Django视图编写
- 视图装饰器api_view
- 查询资源
- 返回所有数据
- 返回单条数据
- 返回json格式的数据
- 新增资源
- 修改资源
- 删除资源
DRF视图编写
常规Django视图编写
序列化器最终的作用是为视图提供转化后的数据,可使用Serializer类编写一些 API视图。这里没有使用任何djangorestframework 框架的其他功能,只是将视图作为常规Django视图编写。
编辑在sqtp
应用app目录下的views.py
文件,导入以下库,并编写一个视图可以返回所有的请求数据
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt # 跨站攻击防护,接口白名单处理
from rest_framework.parsers import JSONParser # 序列化
from sqtp.models import Request # 模型
from sqtp.serializers import RequestSerializer # 自定义的序列化类
def request_list(request):
if request.method == 'GET':
# 构建序列化器返回完整结果集--针对当前数据模型的所有数据
serializer = RequestSerializer(Request.objects.all(),many=True)
# 返回json格式响应
return JsonResponse(data=serializer.data,safe=False) #safe=False是为了支持字典类型以外的python对象转json,例如列表[]
在sqtp
应用app目录下新建urls.py
文件,写入路由
from django.urls import path
from sqtp import views as sqtp_view
urlpatterns = [
path('requests/',sqtp_view.request_list)
]
在 AutoTpsite
项目目录下的 urls.py
文件下引入子路由
from django.contrib import admin
from django.urls import path,include
from sqtp import urls as sqtp_urls
urlpatterns = [
path('admin/', admin.site.urls),
path('',include(sqtp_urls)),
]
执行命令python manage.py runserver 0.0.0.0:8888
启动项目,在浏览器中输入http://127.0.0.1:8888/requests/
,可以发现返回了json数据
[{"id": 38, "method": 0, "url": "/api/teacher/", "params": null, "headers": null, "cookies": null, "data": {"name": "\u5c0f\u738b\u8001\u5e08", "courses": "\u82f1\u8bed", "address": "\u5e7f\u4e1c\u6df1\u5733"}, "json": null, "step": null}, {"id": 39, "method": 0, "url": "/api/teacher/", "params": null, "headers": null, "cookies": null, "data": {"name": "\u5c0f\u738b\u8001\u5e08", "courses": "\u82f1\u8bed", "address": "\u5e7f\u4e1c\u6df1\u5733"}, "json": null, "step": null}]
视图装饰器api_view
接口开发本质上是处理请求和响应,包括了处理请求参数,判断请求方法,处理响应字段,响应码等,本身是个枯燥的活,DRF框架提供自动处理这些枯燥工具的方法:函数视图装饰器@api_view
视图装饰器api_view作用:
-
确保在视图中接收到Request实例,并将上下文添加到Response,以便可以执行内容协商;
-
装饰器还提供了诸如在适当时候返回
405 Method Not Allowed
响应,并处理在使用格式错误的输入来访问request.data
时发生的任何ParseError
异常
查询资源
返回所有数据
修改sqtp
应用app目录下的views.py
文件
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt # 跨站攻击防护,接口白名单处理
from rest_framework.parsers import JSONParser # 序列化
from rest_framework.response import Response
from sqtp.models import Request # 模型
from sqtp.serializers import RequestSerializer # 自定义的序列化类
from rest_framework.decorators import api_view
@api_view(['GET']) # 列表中是允许的请求方法
def request_list(request):
serializer = RequestSerializer(Request.objects.all(), many=True)
return Response(serializer.data) # 使用DRF框架的响应对象,自动分配返回格式
执行命令python manage.py runserver 0.0.0.0:8888
启动项目,在浏览器中输入http://127.0.0.1:8888/requests/
,可以发现页面返回的json数据展示多了一些内容,是因为DRF框架对Response的内容加了一层封装,把数据渲染到一个内部的模板上。
返回单条数据
以上是查询所有数据,再开发一个接口查询单个数据
在sqtp
应用app目录下的views.py
文件下新增视图函数
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt # 跨站攻击防护,接口白名单处理
from rest_framework import status
from rest_framework.parsers import JSONParser # 序列化
from rest_framework.response import Response
from sqtp.models import Request # 模型
from sqtp.serializers import RequestSerializer # 自定义的序列化类
from rest_framework.decorators import api_view
@api_view(['GET']) # 列表中是允许的请求方法
def request_list(request):
serializer = RequestSerializer(Request.objects.all(), many=True)
return Response(serializer.data) # 使用DRF框架的响应对象,自动分配返回格式
@api_view(['GET'])
def request_detail(request,_id):
try:
req_obj = Request.objects.get(id=_id)
# 序列化,将数据对象转化为json格式
serializer = RequestSerializer(req_obj)
return Response(data=serializer.data)
except Exception:
return Response(status=status.HTTP_404_NOT_FOUND) # 返回错误状态码
在sqtp
应用app目录下的urls.py
文件新增路由
from django.urls import path
from sqtp import views as sqtp_view
urlpatterns = [
path('requests/',sqtp_view.request_list),
path('requests/<int:_id>',sqtp_view.request_detail),
]
执行命令python manage.py runserver 0.0.0.0:8888
启动项目,在浏览器中输入http://127.0.0.1:8888/requests/1
,页面就返回单个数据;输入数据库不存在的id,页面则返回404
返回json格式的数据
在浏览器中输入http://127.0.0.1:8888/requests/1
请求,页面返回的是html格式的内容
有这么一个骚操作,在浏览器中输入请求的后缀http://127.0.0.1:8888/requests/38.json
请求,页面可返回json格式的内容
在sqtp
应用app目录下的views.py
文件下修改视图函数,加上参数format
@api_view(['GET']) # 列表中是允许的请求方法
def request_list(request,format=None):
serializer = RequestSerializer(Request.objects.all(), many=True)
return Response(serializer.data) # 使用DRF框架的响应对象,自动分配返回格式
@api_view(['GET'])
def request_detail(request,_id,format=None):
try:
req_obj = Request.objects.get(id=_id)
# 序列化,将数据对象转化为json格式
serializer = RequestSerializer(req_obj)
return Response(data=serializer.data)
except Exception:
return Response(status=status.HTTP_404_NOT_FOUND) # 返回错误状态码
对sqtp
应用app目录下的urls.py
文件的路由信息进行补充,DRF框架提供format_suffix_patterns
方法重写url信息,对请求的url进行进一步处理
from django.urls import path
from sqtp import views as sqtp_view
from rest_framework.urlpatterns import format_suffix_patterns
urlpatterns = [
path('requests/',sqtp_view.request_list),
path('requests/<int:_id>',sqtp_view.request_detail),
]
urlpatterns = format_suffix_patterns(urlpatterns) # 重写url
页面返回的就是json格式的内容
新增资源
新增资源是不需要对id进行操作的,id是数据新增成功由后台自增生成的,所以新增资源对应的路由是/requests/
在sqtp
应用app目录下的views.py
文件下修改request_list
视图函数,使其支持POST
请求
@api_view(['GET','POST']) # 列表中是允许的请求方法
def request_list(request,format=None):
# 处理查询请求
if request.method == 'GET':
serializer = RequestSerializer(Request.objects.all(), many=True)
return Response(serializer.data) # 使用DRF框架的响应对象,自动分配返回格式
# 处理新增请求
elif request.method =='POST':
# 构建序列化器,反序列化,将request.data数据恢复成正常的对象实例
serializer = RequestSerializer(data=request.data)
# 校验数据是否合法
if serializer.is_valid():
serializer.save()
# 新增成功返回新增数据状态码201
return Response(serializer.data,status=status.HTTP_201_CREATED)
# 新增失败返回错误信息400,请求数据有问题
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
执行命令python manage.py runserver 0.0.0.0:8888
启动项目,在浏览器中输入http://127.0.0.1:8888/requests/
,可以发现新增支持POST
请求,点击OPTIONS
按钮,页面就可以选择进行POST
请求操作
在Content
输入框中输入需要新增的json数据,点击POST
按钮,可以发现页面上返回了新增的数据,新增数据成功。也可以去数据库中进行查看确认,可以发现数据库中新增了一条id为40的数据
修改资源
修改资源是需要指定资源id进行操作的,所以修改资源对应的路由是/requests/<id>
在sqtp
应用app目录下的views.py
文件下修改request_detail
视图函数,使其支持PUT
请求
@api_view(['GET','PUT'])
def request_detail(request,_id,format=None):
try:
req_obj = Request.objects.get(id=_id)
except Exception:
return Response(status=status.HTTP_404_NOT_FOUND) # 返回错误状态码
# 处理查询请求
if request.method == 'GET':
# 序列化,将数据对象转化为json格式
serializer = RequestSerializer(req_obj)
return Response(data=serializer.data)
# 处理修改请求
elif request.method == 'PUT':
# 采用序列化器实现修改,这里与查询不同的是,还需要把待修改的数据放到序列化器里进行覆盖
serializer = RequestSerializer(req_obj,data=request.data)
# 判断data中的数据是否符合要求
if serializer.is_valid():
# 若符合要求则进行保存操作
serializer.save()
# 将修改成功的状态码返回
return Response(serializer.data,status=status.HTTP_200_OK)
# 修改失败返回错误信息400,修改传递的数据有问题
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
与查询请求不同的是,查询是将数据从数据库查询返回到前端页面上;而修改是将修改的数据保存到数据库。
执行命令python manage.py runserver 0.0.0.0:8888
启动项目,在浏览器中输入http://127.0.0.1:8888/requests/40
,页面返回了查询id为40的数据,可以发现新增支持PUT
请求,对json数据进行修改,进行PUT
请求操作
操作成功后,可以发现页面上返回了修改后的数据,修改数据成功。也可以去数据库中进行查看确认,可以发现数据库中id为40的数据已发送变化
删除资源
删除资源也是需要指定资源id进行操作的,所以删除资源对应的路由是/requests/<id>
在sqtp
应用app目录下的views.py
文件下修改request_detail
视图函数,使其支持DELETE
请求
@api_view(['GET','PUT','DELETE'])
def request_detail(request,_id,format=None):
try:
req_obj = Request.objects.get(id=_id)
except Exception:
return Response(status=status.HTTP_404_NOT_FOUND) # 返回错误状态码
# 处理查询请求
if request.method == 'GET':
# 序列化,将数据对象转化为json格式
serializer = RequestSerializer(req_obj)
return Response(data=serializer.data)
# 处理修改请求
elif request.method == 'PUT':
# 采用序列化器实现修改,这里与查询不同的是,还需要把待修改的数据放到序列化器里进行覆盖
serializer = RequestSerializer(req_obj,data=request.data)
# 判断data中的数据是否符合要求
if serializer.is_valid():
# 若符合要求则进行保存操作
serializer.save()
# 将修改成功的状态码返回
return Response(serializer.data,status=status.HTTP_200_OK)
# 修改失败返回错误信息400,修改传递的数据有问题
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
# 处理删除请求
elif request.method == 'DELETE':
req_obj.delete() # 获取数据后进行删除
# 将删除成功的状态码返回
return Response(status=status.HTTP_204_NO_CONTENT)
执行命令python manage.py runserver 0.0.0.0:8888
启动项目,在浏览器中输入http://127.0.0.1:8888/requests/40
,页面返回了查询id为40的数据,可以发现新增支持DELETE
按钮,点击按钮可进行删除操作
删除成功后,页面会返回HTTP 204 No Content
,说明数据删除成功。如果再请求http://127.0.0.1:8888/requests/40
,就会发现页面返回HTTP 404 Not Found
,因为这条数据已经被删除,查询失败