15-Django开发REST接口

使用Django开发REST接口

  我们以在Django框架中使用的图书以及书中人物案例来写一套支持图书数据增删改查REST API接口,来理解REST API的开发(前后端均发送JSON格式数据)

路由代码(urls.py):

urlpatterns = [
    path(‘books/‘, views.BookListView.as_view()),
    re_path(‘books/(?P<pk>\d+)/‘, views.BookDetailView.as_view())
]

views.py:

from datetime import datetime
from django.http import JsonResponse,HttpResponse
import json

class BookListView(View):
    """
    查询所有的书籍、增加书籍
    """
    def get(self,request):
        """
        查询所有的书籍,
        路由:GET /books/
        :param request:
        :return:
        """
        queryset = BookInfo.objects.all()
        book_list = []
        for book in queryset:
            book_list.append({
                "id":book.id,
                "btitle":book.title,
                "bpub_date":book.pub_date,
                "bread":book.read,
                "bcommet":book.comment,
                "image":book.image.url if book.image else ""
            })
        #为了不使字典的数据发送,将参数safe变为False
        return JsonResponse(book_list,safe=False)

    def post(self,request):
        """
        新增书籍
        路由:POST/books/
        :param request:
        :return:
        """
        json_bytes = request.body
        json_str = json_bytes.decode()
        #将字符串对象反序列化
        book_dict = json.loads(json_str)
        ################################
        book = BookInfo.objects.create(
            title = book_dict.get("btitle"),
            pub_date = book_dict.get("bpub_date")
            #.....................省略其他参数
        )
        #返回插入的数据,以json格式返回,并且带上状态码
        return JsonResponse({
            "id":book.id,
            "btitle":book.title,
            ‘bpub_date‘: book.pub_date,
            ‘bread‘: book.read,
            ‘bcomment‘: book.comment,
            ‘image‘: book.image.url if book.image else ‘‘
        },status=201)
class BookDetailView(View):
    def get(self,request,pk):
        """
        获取单个图书信息
        路由:GET/books/<pk>/
        :param request:
        :param pk:
        :return:
        """
        try:
            book = BookInfo.objects.get(pk=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse(status=404)

        return JsonResponse({
            "id": book.id,
            "btitle": book.title,
            ‘bpub_date‘: book.pub_date,
            ‘bread‘: book.read,
            ‘bcomment‘: book.comment,
            ‘image‘: book.image.url if book.image else ‘‘
        })
    def put(self,request,pk):
        """
        修改图书信息
        路由:PUT/books/<pk>/
        :param request:
        :param pk:
        :return:
        """
        try:
            book = BookInfo.objects.get(pk=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse(status=404)

        json_bytes = request.body
        json_str = json_bytes.decode()
        book_dict = json.loads(json_str)

        ##########此处详细的校验参数省略#############

        book.title = book_dict.get(‘btitle‘)
        book.pub_date = book_dict.get(‘bpub_date‘)
        book.save()

        return JsonResponse({
            "id": book.id,
            "btitle": book.title,
            ‘bpub_date‘: book.pub_date,
            ‘bread‘: book.read,
            ‘bcomment‘: book.comment,
            ‘image‘: book.image.url if book.image else ‘‘
        })

    def delete(self,request,pk):
        """
        删除图书
        路由:DELETE/books/<pk>/
        :param request:
        :param pk:
        :return:
        """
        try:
            book = BookInfo.objects.get(pk=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse(status=404)
        book.delete()
        return HttpResponse(status=204)

views.py

测试:

使用Postman软件测试接口

1、获取所有图书信息

GET方式访问http://127.0.0.1:8000/books/,返回状态码200以及json数据

2、获取单一的图书数据

GET 访问 http://127.0.0.1:8000/books/5/ ,返回状态码200以及json数据

3、新增书籍信息

POST访问http://127.0.0.1:8000/books/,发送json数据,返回json数据以及状态码

4、修改书籍数据

PUT访问http://127.0.0.1:8000/books/2/,发送json数据,返回json数据以及状态码

5、删除书籍数据

DELETE访问http://127.0.0.1:8000/books/2/,发送json数据,返回状态码204

2、明确REST接口开发的核心任务

在上面的案例中,在开发REST API接口时候,视图主要做的三件事:

  1、将请求的数据(如json格式)转化为模型类对象

  2、操作数据库(增删改查)

  3、将模型类对象转换为响应的数据(如json数据格式)

序列化(Serialization)

  就是将程序中的一个数据结构类型转化为其他格式(字典、json、XML等)。例如在Django中的模型类对象转换为JSON字符串,这就是序列化(json.dumps())

  反之,将其他数据字典、json、XML等)转化为程序的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程就叫反序列化(json.load())

  在开发REST API时,视图中要频繁的进行序列化与反序列化。

总结:

  在开发REST API接口,在视图中需要做的核心就是:1、将数据库数据序列化(json.dumps())为前端所需要的格式,并返回。2、将前端发送的数据反序列化(json.load())为模型类对象,保存在数据库中。

Django REST  framework介绍:

  在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的。

  在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增、删、改、查的实现流程基本套路化,所以这部分代码也是可以复用简化编写的:

  1. 增:校验请求数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
  2. 删:判断要删除的数据是否存在 -> 执行数据库删除
  3. 改:判断要修改的数据是否存在 -> 校验请求的数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
  4. 查:查询数据库 -> 将数据序列化并返回

  Django REST framework可以帮助我们简化上述两部分的代码编写,大大提高REST API的开发速度。Django REST framework 框架是一个用于构建Web API 的强大而又灵活的工具。通常简称为DRF框架 或 REST framework。DRF框架是建立在Django框架基础之上,由Tom Christie大牛二次开发的开源项目。

特点

  • 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
  • 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
  • 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
  • 多种身份认证和权限认证方式的支持;
  • 内置了限流系统;
  • 直观的 API web 界面;
  • 可扩展性,插件丰富

原文地址:https://www.cnblogs.com/lishuntao/p/11725453.html

时间: 2024-11-09 09:41:33

15-Django开发REST接口的相关文章

python3.8.0 Django 开发后端接口api 部署到 Linux Centos7上

经历了两天的时候终于把本地使用python3 django开发的接口API部署到服务器上了,还是记录一下,以免之后忘记,哈哈 注意一点,就是,centos7是基于python2的,我这边默认的是python2.7.5,记住不要删除了python2,否则后果很严重,yum会报错,这是因为python3和python2版本的冲突导致的 第一步,安装 python3 到 Centos7, 先安装软件管理包和可能使用的依赖 yum -y groupinstall "Development tools&q

接口测试框架-Django开发post接口

简介:实现简单的登录接口 一 目录结构如下 二 实现步骤 1 新建文件夹templates, 在文件夹下添加login.html文件(页面) <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>login</title></head><body><form action="

【网络开发】WeX5的Ajax和Django服务器json接口对接跨域问题解决

问题背景 WeX5是典型的html5+js架构.源文件全部放到服务器的UI Server中,使用通用的tomcat,例如使用域名www.wuyoubar.cn:8080/x5. Android和IOS的服务器端Django已经实现了json的处理,json的主域名www.wuyoubar.cn:80 PC访问WeX5页面.避免重复进行数据处理,WeX5的JS代码里面直接使用Ajax请求Django的json接口数据.这样就出现了跨域的问题,对于客户端来说,请求的源码,页面文件,css和js代码等

Django开发常用方法及面试题

1. 对Django的认识? #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. #2.Django内置的ORM跟框架内的其他模块耦合程度高. #应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利: #理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修. #3.Django的卖点是超高的开发效

django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5

前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzheng.sinaapp.com/ 先跳过视图展示及表单处理的部分,先介绍一下如何部署. 标题中已经把部署环境介绍的很清楚了: 服务器:CentOS6.5 其实就是我的开发机 mysql:Server version: 5.1.73 Source distribution nginx版本: nginx/1

Django开发笔记之数据库的设计

后台采用Django开发,可以体会到开发的便利之处,对于一个项目来说,首先最重要的是数据库的设计,那么在Django下数据库设计主要是如下步骤: 1,需求分析,这点子不用多说,而我也深刻体会到了没有原型的时候就开始开发的困难之处,每次需求更改就会带来后台的数据和对应接口的一次变更.费时费精力 2.有了需求,那么开始数据库的设计,在Django中,并不需要直接去操作数据库,而且使用继承modesl.Model的类,在类中定义自己的模型,然后使用Python manage.py syncdb就可看到

django开发个人简易Blog——构建项目结构

开发之前第一步,就是构造整个的项目结构.这就好比作一幅画,第一步就是描绘轮廓,有了轮廓,剩下的就是慢慢的填充细节.项目结构规划如下图: 项目结构描述: 本项目以fengzhengBlog为根目录. admin.blogapp是两个app目录,用于实现项目主要功能:包括模型定义.视图定义等 css.js.images分别为样式文件.js.图片的静态文件存放目录. template目录存放模板文件. ueEditor是富文本编辑器uEditor的目录. settings.py是全局配置文件,urls

Mock, 让你的开发脱离接口

在前后台共同进行一个项目的时候常会遇到一种情景, 后台定义好接口,前端按照接口进行开发, 当前端开发完成后台接口却还没有开发完成, 这个时候要进行接口测试, 只能等后台开发完成才能测试, 在这中间浪费了很多时间,  现在有个利器可以解决这个问题, 即使不用后台,只要提前制定好接口的报文,那么前端就可以自己模拟接口来进行接口测试了, 今天要讲的东西就是mockjax和mockJSON mockjax和mockJSON是两套不同的Javascript Library, 它们都是基于JQuery来开发

django开发环境搭建(参考流程)

django开发环境搭建(参考流程) 2013-08-08 01:09:06 分类: LINUX 原文地址:django开发环境搭建(参考流程) 作者:bailiangcn 对于一个初学者,在实际的开发环境中,应该采用什么的样的工具来开发django呢? 我想环境至少应该具备的特性有: 多版本python环境的支持 版本控制 自动测试框架 数据库支持迁移 部署的自动化 参考文档 主要参考的文档-英文 virtualenv介绍 VirtualEnv 和Pip 构建Python的虚拟工作环境 使用V