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": "u5c0fu738bu8001u5e08", "courses": "u82f1u8bed", "address": "u5e7fu4e1cu6df1u5733"}, "json": null, "step": null}, {"id": 39, "method": 0, "url": "/api/teacher/", "params": null, "headers": null, "cookies": null, "data": {"name": "u5c0fu738bu8001u5e08", "courses": "u82f1u8bed", "address": "u5e7fu4e1cu6df1u5733"}, "json": null, "step": null}]

视图装饰api_view

接口开发本质上是处理请求响应,包括了处理请求参数判断请求方法处理响应字段响应码等,本身是个枯燥的活,DRF框架提供自动处理这些枯燥工具方法函数视图装饰@api_view

视图装饰api_view作用

查询资源
返回所有数据

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

原文地址:https://blog.csdn.net/qq_44614026/article/details/128693449

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_40278.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注