Django REST framework--DRF视图

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Django REST framework--DRF视图

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go

“Django REST framework--DRF视图” 的相关文章