基于Django RESTframework设计Restful API

导语

? 关于RESTful的问题,在最近的面试中遇到很多,之前有过一定的了解,但没有系统性的总结分析。所以现在结合Django RESTframework来加深对RESTful的理解,同时梳理这过程的一些知识点。

什么是RESTful?

?这个问题是最容易想到的,首先要分析这个问题,网上的其他文章都会讲到有关REST(Representational State Transfer),中文翻译:”表述性状态传递“,再白话一点就是对资源的表述性状态传递。刚开始,看到这里头都大了,那我们来看看其中比较关键需要了解到的知识点。

Resources(资源)

?这里的资源指的是网络上的每一个实体,而每一个实体都有着对应的URI(统一资源标识符),如果需要访问这个资源,可以通过访问它的URI即可。

Representation(表现层)

?简单来说就是资源的表现形式,比如图片、HTML、文本等等。

State Transfer(状态转化)

? 客户端可以通过GET、POST、PUT、DELETE HTTP动词来操作资源。

小结

??REST从资源的角度来审视整个网络,将分布再网络中某个结点通过URI进行标识,而客户端和服务端传递的是资源的某种表现层,并且客户端通过HTTP动词,对服务器资源操作,实现”表述性状态转化“。(表述性:客户端请求一个资源,并且通过服务器拿到资源)
?满足以上这些约束条件和原则的应用程序或设计就是RESTful。换言之RESTful就是一种架构的规范和约束。

RESTful API

对API的设计来讲,RESTful是如今常见的的设计规范,通常用于Web数据接口的设计。这里讲讲从网上大致总结的几个RESTful API的设计细节。

URI设计

1、动词+宾语

?客户端使用”动词+宾语"的结构操作服务器资源,动词指的是HTTP动词,宾语指的是资源。HTTP动词对应的服务器资源操作:

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

2、宾语必须是名词

?由于宾语是API中的URI,是HTTP动词作用的的对象,应该是名词,而不是动词。

3、复数URI

?对于URI建议使用复数

3、避免多级的URI

状态码

客户端的每一次请求,服务器给出回应,而回应包括HTTP状态码和数据两部分。
HTTP状态码的含义:

  1. 1xx:相关信息
  2. 2xx:操作成功
  3. 3xx:重定向
  4. 4xx:客户端错误
  5. 5xx:服务器错误

服务器回应

1、不要返回纯文本

?API返回的数据格式,不应该是一个纯文本,应该是一个JSON对象,这样才符合结构化流程。同样服务器回应的HTTP头的Content-Type属性同样要设置为application/json。

2、发生错误时,不要返回200状态码

?在发生错误的时候,不应该返回一个200状态码,然后把错误信息放在数据体里,因为这样会导致需要解析完数据体才能知道操作失败。

Django RestFramework

?Django RestFramework是一个基于Django上构建符合RESTful风格Web api,并且自身还带有测试的页面,方便测试自己的API,所以对于”前后端分离“的开发模式来讲十分合适。

关于前后端分离

?前后端分离指的是后端来说只需要提供数据接口,不再渲染模板,前端只需要获取数据并且呈现。这样的有许多优点:

  • 前后端解耦,接口复用,减少开发量
  • 各司其职,前后端同步开发,提升工作效率,定好接口规范
  • 更利于调试、测试和运维

Django RestFramework简介

Rest Framework基本组件:

  • APIView
  • 解析器组件:对请求的数据进行解析,根据不同请求题进行解析
  • 序列化组件:类似于Django的Form,可以通过自定义操作获得想要的数据形式
  • 视图类(mixin)
  • 认证组件
  • 权限组件
  • 频率组件
  • 分页组件
  • 响应器组件
  • url注册器

处理流程

?关于Django的视图函数,可以基于FBV模式也可以基于CBV模式

  • FBV模式:Django的路由映射表里进行url和视图函数的关联
  • CBV模式:而CBV模式则是在views.py中定义视图类,在视图类中视图函数,如(get,post,put,delete)等
    ?Django RESTFramework就是基于CBV模式,当一个http请求到达Django后,首先执行中间件的方法,然后在进行路由匹配。

?当路由匹配后,会执行自定义类中的as_view()方法,如果不存在则会调用父类的as_view()方法,最后再调用到dispatch()方法处理不同request请求,执行不同的方法。(这段过程中设计到Django CBV模式的处理流程,以及一些源码知识)

Django RESTframework使用

项目配置

安装Django restframework:

pip install djangorestframework

新建项目,新建应用,修改settings.py

django-admin startproject Crawl
cd Crawl
python manage.py startapp music

settings.py(将rest_framework新增到INSTALLED_APPS)

(其余的修改数据库配置、修改语言、时区就不一一列出来)
项目文件树:

项目设计数据库

设计一个有关于存储歌曲的详细信息表(music/models.py):

from django.db import models

class Music(models.Model):
    music_author = models.CharField(max_length=50, verbose_name=‘歌唱者‘)
    music_name = models.CharField(max_length=100, verbose_name=‘歌曲名‘)
    music_album = models.CharField(max_length=100, verbose_name=‘专辑‘)
    music_time = models.CharField(max_length=10, verbose_name=‘歌曲时间‘)
    music_type = models.CharField(
        max_length=100, null=True, verbose_name=‘歌曲类型‘, default=None)
    music_lyrics = models.CharField(
        max_length=100, blank=True, verbose_name=‘作词者‘)
    music_arranger = models.CharField(
        max_length=100, blank=True, verbose_name=‘作曲者‘)

同步数据库:

python manage.py makemigrations
python manage.py migrate

Serializers

创建一个序列化Serialier类,提供序列化和反序列化的途径,使之可以转化为如json的表现形式,类似于Django的Form表单的原理。在music目录下,创建serializers.py:

from rest_framework import serializers
from music.models import *

class MusicSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ‘__all__‘
        model = Music

Views.py和Urls.py

通过前面提到的CBV模式,设计视图处理函数和路由映射:
Crawl/urls.py

from django.contrib import admin
from django.urls import path, include
import music

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘api/‘, include(‘music.urls‘)),
]

music/urls.py

from django.urls import path
from music.views import *

urlpatterns = [
        path(‘‘, MusicList.as_view()),
        path(‘<int:pk>/‘, MusicDetail.as_view()),
        ]

music/views.py

from django.shortcuts import render
from rest_framework import generics
from rest_framework.views import APIView
from rest_framework.response import Response
from music.models import *
from music.serializers import MusicSerializer

# Create your views here.

class MusicList(APIView):
    def get(self, request):
        queryset = Music.objects.all()
        ret = MusicSerializer(queryset, many=True)
        return Response(ret.data)

    def post(self, request):
        music = MusicSerializer(data=request.data)

        if music.is_valid():
            music.save()
            return Response(music.data)
        else:
            return Response(music.errors)

class MusicDetail(generics.RetrieveAPIView):
    queryset = Music.objects.all()
    serializer_class = MusicSerializer

代码详解:

?代码比较简单,主要就是继承restframework框架的通用视图函数generics,或者APIView。如果先省事,建议generics,因为提供的通用视图可以允许你快速构建与数据相关的API视图,当然如果觉得通用视图不适合自己的API需求,可以使用APIView类。
(在这里两种方式都用到了,可以对比他们的区别)

测试结果

模拟请求API接口(GET、POST请求)


自带的测试页面:

总结

刚开始接触到RESTful方面的知识还是非常懵的,对网上很多文章感觉讲的也不是很全面,所以索性总结一下,然后接触到RESTFramework框架也发现到了很多在Django方面不熟悉的地方,如CBV模式,以及工作的原理,有些都牵扯到框架内的源码,也是从网上一些优秀的文章一点点慢慢了解到,之后对Django RESTframework相关知识也会继续总结学习,下面是我在网上参考的一些文章,有兴趣的可以了解一下。

参考链接:

https://www.cnblogs.com/renpingsheng/p/9531649.html
https://www.cnblogs.com/renpingsheng/p/9534984.html#FeedBack
https://www.jianshu.com/p/08a998f74ac7

原文地址:https://blog.51cto.com/mbb97/2431272

时间: 2024-12-29 10:50:52

基于Django RESTframework设计Restful API的相关文章

使用 Python 和 Flask 设计 RESTful API

近些年来 REST (REpresentational State Transfer) 已经变成了 web services 和 web APIs 的标配. 在本文中我将向你展示如何简单地使用 Python 和 Flask 框架来创建一个 RESTful 的 web service. 什么是 REST? 六条设计规范定义了一个 REST 系统的特点: 客户端-服务器: 客户端和服务器之间隔离,服务器提供服务,客户端进行消费. 无状态: 从客户端到服务器的每个请求都必须包含理解请求所必需的信息.换

基于beego一键创建restful api

借鉴自这里 restful协议可以参考如下,当然最好的,看rails的rake routes,那个最标准了 URL HTTP Verb Functionality /object POST Creating Objects /object/objectId GET Retrieving Objects /object/objectId PUT Updating Objects /object GET Queries /object/objectId DELETE Deleting Objects

基于 django RestFramework ,加工或者修改 request.POST 的数据内容

背景: 经常,我们希望在 django的viewset视图函数 中对request中的数据进行一定的添加或修改,然后才将数据传到 serializer中去. 例如,根据前端的token 提取出某用户的个人信息,再将个人信息和表单数据一起提交到serializer,serializer.save() 保存到数据库中,记录下添加该条数据 的用户. 问题点: 但是django 机制中的 request 是不允许被修改的 解决方案: 1.data = request.POST.copy() 复制requ

如何设计好的RESTful API 之好的RESTful API 特征

原文地址:http://blog.csdn.net/ywk253100/article/details/25654021 导读:设计好RESTful API对于软件架构的可扩展性.可伸缩性和消费者的体验都具有至关重要的作用.本次虚拟研讨会的主题是,如何设计好的RESTful API. 关键词:RESTful API REST OAuth协议 REST架 构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风格的一个典

如何设计好的RESTful API之安全性

原文:http://blog.csdn.net/ywk253100/article/details/25654101 导读:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证.授权.身份管理等安全需求.如何保证RESTful API的安全性呢. 关键词:RESTful API API安全性 前面讲了好的RESTful API具有的一些特征,本文会继续探讨RESTful API的安全性问题. InfoQ:安全是恒久的话题,

虚拟研讨会:如何设计好的RESTful API(转)

原文:虚拟研讨会:如何设计好的RESTful API? REST架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风格的一个典型应用.从其诞生之日开始,它就因其可扩展性和简单性受到越来越多的架构师和开发者们的青睐.它必将得到更大的发展.一方面,随着云计算和移动计算的兴起,许多企业愿意在互联网上共享自己的数据.功能:另一方面,在企业中,RESTful API(也称RESTful Web服务)也逐渐超越SOAP成为实

【API设计】RESTful API 设计指南

RESTful API URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作. 例如 1. REST描述的是在网络中client和server的一种交互形式:REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口): 2. Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词."资源"是REST架构或者说整个网络处理的核心.比如: http://api.qc.com/v1/newsfeed

学习RESTful API

总是见到文章有提到RESTful API的,却不知道是什么东西,找到这篇文章,觉得讲得不错,就转载到这里来吧. 另外也有一篇文章也不错,发个链接:白话REST-识别真假REST ---------------------- 前几日,有一小哥突然问我:陈陈,你会RESTful API吗?我说:不会呀,他说:那我教你好了.然后我就把该小哥拉入"黑名单"了,理由是唱你妹的小星星.然后去深入的学习了一下REST相关的东西. RESTful API对我并不是一个全新的像是突然蹦出来的词汇,我印象

SpringBoot RESTful API 架构风格实践

如果你要问 Spring Boot 做什么最厉害,我想答案就在本章标题 RESTful API 简称 REST API . 1 RESTful API 概述 1.1 什么是 RESTful API Rest 是一种规范,符合 Rest 的 Api 就是 Rest Api.简单的说就是可联网设备利用 HTTP 协议通过 GET.POST.DELETE.PUT.PATCH 来操作具有URI标识的服务器资源,返回统一格式的资源信息,包括 JSON.XML.CSV.ProtoBuf.其他格式. 1.2