【愚公系列】2022年04月 Python教学课程 61-Django框架Resful接口

2022-04-12 08:24:53 浏览数 (1)

文章目录

  • 一、Resful接口介绍
  • 二、相关案例
    • 1.Django中Resful路由代码
    • 2.Django中Resful业务代码
  • 总结

一、Resful接口介绍

RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

RESTFUL特点包括:

  1. 每一个URI代表1种资源;
  2. 客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
  3. 通过操作资源的表现形式来操作资源;
  4. 资源的表现形式是XML或者HTML;
  5. 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。

二、相关案例

1.Django中Resful路由代码

代码语言:javascript复制
from django.conf.urls import url
from django.contrib import admin
from . import views
urlpatterns = [
    # 获取所有和保存图书
    url(r'^books/$',views.BooksView.as_view() ),
    url(r'^books/(?Pd )/$',views.BookView.as_view() ),
]

2.Django中Resful业务代码

代码语言:javascript复制
import os
from django.shortcuts import render, reverse
from django.views import View
from book.models import BookInfo, HeroInfo
from django.conf import settings
from django.http import JsonResponse, HttpResponse
from django.template import loader
import json

class BooksView(View):
    """
        获取所有图书和保存图书
    """
    def get(self, request):
        """
            获取所有图书
        :param request:
        :return:
        """
        # 1、查询图书表获取所有图书对象
        books = BookInfo.objects.all()
        # 2、提取所有对象的字段内容
        book_list = []
        for book in books:
            data = {
                'id': book.id,
                'btitle': book.btitle,
                'bread': book.bread,
                'bpub_date': book.bpub_date
            }
            book_list.append(data)
        # 3、返回所有对象字段内容
        return JsonResponse({'book_list': book_list})

    def post(self, request):
        """
            保存图书
        :param request:
        :return:
        """
        # 1、获取保存的图书数据
        data = request.body.decode()
        data_dict = json.loads(data)
        # 2、验证图书数据字段
        btitle = data_dict.get('btitle')
        bpub_date = data_dict.get('bpub_date')
        if btitle is None or bpub_date is None:
            return JsonResponse({'error': '缺少必要数据'})
        # 3、保存图书
        book = BookInfo.objects.create(btitle=btitle, bpub_date=bpub_date)
        # 4、返回保存后的图书数据

        return JsonResponse(
            {
                'id': book.id,
                'btitle': book.btitle,
                'bread': book.bread,
                'bpub_date': book.bpub_date
            }
        )



class BookView(View):
    """
        获取单一图书数据
        更新图书
        删除图书
    """

    def get(self, request, pk):
        """
        获取单一图书数据
        :param request:
        :param pk:
        :return:
        """
        # 1、根据pk值查询图书对象
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': '错误的id值'})
        # 2、返回图书数据
        return JsonResponse(
            {
                'id': book.id,
                'btitle': book.btitle,
                'bread': book.bread,
                'bpub_date': book.bpub_date
            }
        )

    def put(self, request, pk):
        """
         更新图书
        :param request:
        :param pk:
        :return:
        """
        # 1、获取保存的图书数据
        data = request.body.decode()
        data_dict = json.loads(data)
        # 2、验证图书数据字段
        btitle = data_dict.get('btitle')
        bpub_date = data_dict.get('bpub_date')
        if btitle is None or bpub_date is None:
            return JsonResponse({'error': '缺少必要数据'})
        # 3、更新图书
        # try:
        #     book = BookInfo.objects.get(id=pk)
        # except:
        #     return JsonResponse({'error': '错误的id值'})
        #
        # book.btitle=btitle
        # book.bpub_date=bpub_date
        # book.save()
        # {'name':'python'}  name=python  {'btitle':'书名'}
        num = BookInfo.objects.filter(id=pk).update(**data_dict)
        # 4、返回保存后的图书数据
        book = BookInfo.objects.get(id=pk)

        return JsonResponse(
            {
                'id': book.id,
                'btitle': book.btitle,
                'bread': book.bread,
                'bpub_date': book.bpub_date
            }
        )

    def delete(self, request, pk):
        """
        删除图书
        :param request:
        :param pk:
        :return:
        """
        # 1、查询删除的图书对象
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': '错误的id值'})
        # 2、逻辑
        book.is_delete = True
        book.save()
        # 物理删除
        # book.delete()

        # 3、返回结果
        return JsonResponse({})

总结

Resful接口增删改查接口说明:

1、查询

查询

传统

REST

查询所有

http://localhost:8080/employee/list

http://localhost:8080/employees

查询单个

http://localhost:8080/employee/list?id=1

http://localhost:8080/employees/1

2、添加

添加

传统

REST

添加

http://localhost:8080/employee/add

http://localhost:8080/employees

3、修改

修改

传统

REST

修改

http://localhost:8080/employee/update

http://localhost:8080/employees

4、删除

删除

传统

REST

删除

http://localhost:8080/employee/delete

http://localhost:8080//employees/{id}

返回状态码说明:

状态码

含义

200

OK - [GET] 服务器成功返回用户请求的数据

201

CREATED - [POST/PUT/PATCH] 用户新建或修改数据成功

202

Accepted 表示一个请求已经进入后台排队(异步任务)

204

NO CONTENT - [DELETE] 用户删除数据成功

400

INVALID REQUEST - [POST/PUT/PATCH] 用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的

401

Unauthorized - [*] 表示用户没有权限(令牌、用户名、密码错误)

403

Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的

404

NOT FOUND - [*] 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的

405

Method Not Allowed 方法不允许,服务器没有该方法

406

Not Acceptable - [GET] 用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)

410

Gone -[GET] 用户请求的资源被永久删除,且不会再得到的

422

Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误

500

INTERNAL SERVER ERROR - [*] 服务器发生错误,用户将无法判断发出的请求是否成功

0 人点赞