基于Django RESTframework设计Restful API
2021-02-07 10:15
标签:info http请求 err 路由 系统 lock 流程 调试 小结 ? 关于RESTful的问题,在最近的面试中遇到很多,之前有过一定的了解,但没有系统性的总结分析。所以现在结合Django RESTframework来加深对RESTful的理解,同时梳理这过程的一些知识点。 ?这个问题是最容易想到的,首先要分析这个问题,网上的其他文章都会讲到有关REST(Representational State Transfer),中文翻译:”表述性状态传递“,再白话一点就是对资源的表述性状态传递。刚开始,看到这里头都大了,那我们来看看其中比较关键需要了解到的知识点。 ?这里的资源指的是网络上的每一个实体,而每一个实体都有着对应的URI(统一资源标识符),如果需要访问这个资源,可以通过访问它的URI即可。 ?简单来说就是资源的表现形式,比如图片、HTML、文本等等。 ? 客户端可以通过GET、POST、PUT、DELETE HTTP动词来操作资源。 ??REST从资源的角度来审视整个网络,将分布再网络中某个结点通过URI进行标识,而客户端和服务端传递的是资源的某种表现层,并且客户端通过HTTP动词,对服务器资源操作,实现”表述性状态转化“。(表述性:客户端请求一个资源,并且通过服务器拿到资源) 对API的设计来讲,RESTful是如今常见的的设计规范,通常用于Web数据接口的设计。这里讲讲从网上大致总结的几个RESTful API的设计细节。 ?客户端使用”动词+宾语"的结构操作服务器资源,动词指的是HTTP动词,宾语指的是资源。HTTP动词对应的服务器资源操作: ?由于宾语是API中的URI,是HTTP动词作用的的对象,应该是名词,而不是动词。 ?对于URI建议使用复数 客户端的每一次请求,服务器给出回应,而回应包括HTTP状态码和数据两部分。 ?API返回的数据格式,不应该是一个纯文本,应该是一个JSON对象,这样才符合结构化流程。同样服务器回应的HTTP头的Content-Type属性同样要设置为application/json。 ?在发生错误的时候,不应该返回一个200状态码,然后把错误信息放在数据体里,因为这样会导致需要解析完数据体才能知道操作失败。 ?Django RestFramework是一个基于Django上构建符合RESTful风格Web api,并且自身还带有测试的页面,方便测试自己的API,所以对于”前后端分离“的开发模式来讲十分合适。 ?前后端分离指的是后端来说只需要提供数据接口,不再渲染模板,前端只需要获取数据并且呈现。这样的有许多优点: Rest Framework基本组件: ?关于Django的视图函数,可以基于FBV模式也可以基于CBV模式: ?当路由匹配后,会执行自定义类中的as_view()方法,如果不存在则会调用父类的as_view()方法,最后再调用到dispatch()方法处理不同request请求,执行不同的方法。(这段过程中设计到Django CBV模式的处理流程,以及一些源码知识) 安装Django restframework: 新建项目,新建应用,修改settings.py settings.py(将rest_framework新增到INSTALLED_APPS) (其余的修改数据库配置、修改语言、时区就不一一列出来) 设计一个有关于存储歌曲的详细信息表(music/models.py): 同步数据库: 创建一个序列化Serialier类,提供序列化和反序列化的途径,使之可以转化为如json的表现形式,类似于Django的Form表单的原理。在music目录下,创建serializers.py: 通过前面提到的CBV模式,设计视图处理函数和路由映射: music/urls.py music/views.py 代码详解: ?代码比较简单,主要就是继承restframework框架的通用视图函数generics,或者APIView。如果先省事,建议generics,因为提供的通用视图可以允许你快速构建与数据相关的API视图,当然如果觉得通用视图不适合自己的API需求,可以使用APIView类。 模拟请求API接口(GET、POST请求) 自带的测试页面: 刚开始接触到RESTful方面的知识还是非常懵的,对网上很多文章感觉讲的也不是很全面,所以索性总结一下,然后接触到RESTFramework框架也发现到了很多在Django方面不熟悉的地方,如CBV模式,以及工作的原理,有些都牵扯到框架内的源码,也是从网上一些优秀的文章一点点慢慢了解到,之后对Django RESTframework相关知识也会继续总结学习,下面是我在网上参考的一些文章,有兴趣的可以了解一下。 参考链接: https://www.cnblogs.com/renpingsheng/p/9531649.html 基于Django RESTframework设计Restful API 标签:info http请求 err 路由 系统 lock 流程 调试 小结 原文地址:https://blog.51cto.com/mbb97/2431272
什么是RESTful?
Resources(资源)
Representation(表现层)
State Transfer(状态转化)
小结
?满足以上这些约束条件和原则的应用程序或设计就是RESTful。换言之RESTful就是一种架构的规范和约束。RESTful API
URI设计
1、动词+宾语
2、宾语必须是名词
3、复数URI
3、避免多级的URI
状态码
HTTP状态码的含义:
服务器回应
1、不要返回纯文本
2、发生错误时,不要返回200状态码
Django RestFramework
关于前后端分离
Django RestFramework简介
处理流程
?Django RESTFramework就是基于CBV模式,当一个http请求到达Django后,首先执行中间件的方法,然后在进行路由匹配。
Django RESTframework使用
项目配置
pip install djangorestframework
django-admin startproject Crawl
cd Crawl
python manage.py startapp music
项目文件树:项目设计数据库
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
from rest_framework import serializers
from music.models import *
class MusicSerializer(serializers.ModelSerializer):
class Meta:
fields = ‘__all__‘
model = Music
Views.py和Urls.py
Crawl/urls.pyfrom django.contrib import admin
from django.urls import path, include
import music
urlpatterns = [
path(‘admin/‘, admin.site.urls),
path(‘api/‘, include(‘music.urls‘)),
]
from django.urls import path
from music.views import *
urlpatterns = [
path(‘‘, MusicList.as_view()),
path(‘
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
(在这里两种方式都用到了,可以对比他们的区别)测试结果
总结
https://www.cnblogs.com/renpingsheng/p/9534984.html#FeedBack
https://www.jianshu.com/p/08a998f74ac7
下一篇:常用Windows消息合集
文章标题:基于Django RESTframework设计Restful API
文章链接:http://soscw.com/index.php/essay/52130.html