Django REST framework--DRF视图
创始人
2024-05-12 00:50:23
0

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_viewurlpatterns = [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_urlsurlpatterns = [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 Responsefrom 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 Responsefrom 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_viewurlpatterns = [path('requests/',sqtp_view.request_list),path('requests/',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_patternsurlpatterns = [path('requests/',sqtp_view.request_list),path('requests/',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()# 新增成功返回新增数据状态码201return 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/

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/

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,因为这条数据已经被删除,查询失败

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...