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

举报
愚公搬代码 发表于 2022/04/12 01:25:04 2022/04/12
【摘要】 一、Resful接口介绍RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。RESTFUL特点包括:每一个URI代表1种资源;客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务...

一、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路由代码

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/(?P<pk>\d+)/$',views.BookView.as_view() ),
]

2.Django中Resful业务代码

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 - [*] 服务器发生错误,用户将无法判断发出的请求是否成功
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。