Django REST framework--DRF视图

news2024/11/17 15:28:23

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【饥荒】本地服务器+内网穿透

本地服务器搭建方法 准备工具 网易UU加速器&#xff08;用于加速科雷官网登陆和steam创意工坊&#xff09;Don’t Starve Together Dedicated Server(steam饥荒联机版开服工具) 获取方法&#xff1a;在库中勾选工具&#xff0c;然后搜索Don’t Starve Together Dedicated Ser…

Unity SRP自定义渲染管线学习1.2:初步绘制

绘制物体 绘制物体&#xff0c;包括不透明的物体&#xff0c;透明物体&#xff0c;再加上之前的天空盒 Camera void DrawVisibleGeometry(){//我们需要将不透明物体和透明物体分开绘制//如果我们直接先绘制所有的物体&#xff0c;然后再绘制天空盒&#xff0c;我们就会看到对…

nodejs+vue家庭食谱饮食方案管理系统网站python php java

本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看美食食谱&#xff0c;一周健康食谱安排&#xff0c;查看美食食材&#xff0c;在线交流发布帖子&#xff1b;管理员可以对食谱分类&#xff0c;食谱信息&#xff0c;材料信息&#xff0c;美…

区块链技术2---BTC的数据结构

1&#xff1a;Hash pointers&#xff08;哈希指针&#xff09;和普通指针相比&#xff0c;哈希指针除了保存地址还保存哈希值2&#xff1a;Block chain区块链中的区块通过哈希指针相连&#xff0c;这里的哈希指针的哈希值是对前一个区块的整体取哈希值&#xff08;包括前一个区…

linux系统中使用QT实现摄像头功能的方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用QT中的Camera的功能和实现。 目录 第一&#xff1a;摄像头资源简介 第二&#xff1a;环境搭建要求 第三&#xff1a;代码编译实现要求 第一&#xff1a;摄像头资源简介 开发板上有一路“CSI”摄像头接口&#xf…

组件封装 - steps组件

首先, 我先来看看效果 steps 组件的封装和 tabs 组件还是相似的 都会去指定两个组件来完成(仿Element UI), 都会去使用 jsx 的语法 让其中一个组件去规定样式和排版, 另外一个组件去接收父组件传入的动态数据 但和面包屑组件还是有区别的(面包屑组件封装): 相同点都是使用两…

v-for 的“就地更新”策略

前言 我们平时使用v-for的时候通常都是加一个唯一标识key&#xff0c;因为不加的时候Vue会给我们发出警告。其实我们加上key的操作&#xff0c;就是为了避免它的“就地更新”策略。我们来看一下官网对“就地更新”的解释&#xff1a; 当 Vue 正在更新使用 v-for 渲染的元素列表…

jsp文化活动系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 文化活动系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用web模式开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数…

第4章 任务看门狗

任务看门狗 主任务死循环 在app_main任务中死循环 #include <stdio.h> #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h"const char *TAG "COUNTER";int count 0;void app_main(void) {wh…

[翻译]PG15新特性-加速WAL日志归档

PG15新特性-加速WAL日志归档PG15通过&#xff1a;一次扫描64个待归档的日志&#xff0c;将其放到一个数组中以供归档&#xff0c;当处理完这64个文件后&#xff0c;再进行下一次扫描。这样达到减少archive_status目录扫描次数提升性能的目的。WAL归档介绍PG15如何加速归档前&am…

C++ · 入门 · 05 | 内联函数

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

SegFormer学习笔记(4)train续2

这次关注一下最关键的东西&#xff1a;用什么网络&#xff0c;用什么数据&#xff0c;预训练数据在哪里呢&#xff1f;为了方便&#xff0c;重新贴一下 train.pyimport torch import argparse import yaml import time import multiprocessing as mp from tabulate import tab…

JVM笔记——根据黑马jvm课程课件+自己总结

JVM一、内存结构1、程序计数器&#xff08;PC Register&#xff09;2、虚拟机栈&#xff08;JVM Stacks&#xff09;3、本地方法栈&#xff08;Native Method Stacks&#xff09;4、堆&#xff08;Heap&#xff09;5、方法区&#xff08;Method Area&#xff09;6、直接内存二、…

【爬虫】第七部分 scrapy

【爬虫】第七部分 scrapy 文章目录【爬虫】第七部分 scrapy7. scrapy7.1 基本使用7.2 项目的文件结构7.3 response的方法和属性7.4 小案例7.5 scrapy 工作原理7.6 管道的使用7.7 多管道下载7.8 下载分页类型和get请求的使用7.9 下载多层级类型7.10 post请求的使用总结7. scrapy…

清华大学出版——C语言从入门到精通(第4版)

《C语言从入门到精通&#xff08;第4版&#xff09;》是清华大学出版社出版的图书&#xff0c;该书从初学者的角度出发&#xff0c;以通俗易懂的语言&#xff0c;丰富多彩的实例&#xff0c;详细介绍了使用C语言进行程序开发需要掌握的各方面知识。《C语言从入门到精通&#xf…

YOLO v8详解

回顾一下YOLOv5 Backbone&#xff1a;CSPDarkNet结构&#xff0c;主要结构思想的体现在C3模块&#xff0c;这里也是梯度分流的主要思想所在的地方&#xff1b;PAN-FPN&#xff1a;双流的FPN&#xff0c;但是量化还是有些需要图优化才可以达到最优的性能&#xff0c;比如cat前后…

VSCode 配置Go环境,弹出警告“golps”等插件要求下载但下载时超时、失去连接等 解决方案

1. 背景&#xff1a; 下载完GO环境和VSCode的GO配套插件后&#xff0c;试图运行hello world程序&#xff0c;此时VSCode弹出警告&#xff1a; 提示有几个go的工具没有下载&#xff0c;于是我点击install 下载&#xff1a; 》下载时报错&#xff0c;一般是出现超时timeout错误…

57 mac 中 SIGINFO 信号, jdk8 支持, 但是 jdk9 不支持?

前言 问题来自于文章 shell脚本 后台启动 程序1 “tail -f log“, ctrl c 导致程序1中断 中的测试用例 Test07Signal2ParentProcess, 可以看到 我当时标记了一个 "todo, not work in hostpostVM9" 然后 问题是这样的, 我同一台机器, 然后 jdk8 带上 SIGINFO 去执行…

【已解决】右键以某应用打开xx文件时,没有“默认”选项怎么办

问题解决方案简单来说详细操作解释问题 右键以某应用打开xx文件时&#xff0c;没有“默认”选项 解决方案 简单来说 在注册表&#xff1a;计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\找到要打开的文件后缀名&#xff0c;删除…

mybatis plus基本使用初体验01

我们都知道MyBatis是目前比较常用的持久层框架&#xff1b;这个框架的使用也是很简单的&#xff0c;我们在使用的时候&#xff0c;只需要关注mapper的接口层和对应的xml文件即可。 但是MyBatis作为一个半自动框架&#xff0c;是需要我们自己手动编写sql语句的&#xff0c;对于…