一、REST基础概念
1.前言
(1)REST是所有Web应用都应该遵守的架构设计指导原则。
(2)REST:核心: 资源,状态转移,统一接口。
资源: 是REST最明显的特征,是指对某类信息实体的抽象,资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。
状态转移: 是指客户端和服务端进行交互的过程中,客户端能够通过对资源的表述,实现操作资源的目的。
统一接口: REST要求,必须通过统一的接口来对资源执行各种操作。
2.http请求方式
GET(SELECT):从服务器取出资源(一项或多项)
POST(CREATE):在服务器新建一个资源
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)
PATCH(UPDATE):在服务器更新资源(客户端提供部分改变的属性)
DELETE(DELETE):从服务器删除资源
3.常用状态码
200 OK - [GET]:服务器成功返回用户请求的数据。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作。
403 Forbidden - [] 表示用户得到授权,但是访问是被禁止的。
404 NOT FOUND - []:用户发出的请求针对的是不存在的记录,服务器没有进行操作。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
二、Django中使用restful
1.安装
pip install djangorestframework==3.4.6
pip install django-filter
2.修改setting.py配置文件
INSTALLED_APPS = [
...
'rest_framework',
]
3.在应用app中定义路由
定义路由需要注意:
(1)使用router.register注册的url为资源,而且资源只能为名词不能为动词。
(2)定义的资源不要加'/'斜杠,在访问地址的时候,URL中会默认的添加斜杠'/'
from django.conf.urls import url
from rest_framework.routers import SimpleRouter
from article import views
# 生成路由对象
router = SimpleRouter()
# 路由管理资源art
router.register('art', views.ArticleView)
urlpatterns = [
]
# 生成资源对应的路由地址
urlpatterns += router.urls
4.在views.py文件中定义ArticleView类
(1)通过定义StudentView并继承了mixins的方法,即可有对应个增删改查的方法。
(2)在ArticleView中还定义了两个变量queryset和serializer_class。
from django.shortcuts import render
from rest_framework import mixins, viewsets
from article.article_serializer import ArticleSerializer
from article.models import Article
class ArticleView(viewsets.GenericViewSet,
mixins.ListModelMixin,
mixins.DestroyModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.RetrieveModelMixin):
# 查询返回的数据
queryset = Article.objects.all()
# 序列化返回的文章数据
serializer_class = ArticleSerializer
5.定义序列化类
序列化类需要继承ModelSerializer,使用ModelSerializer表明序列化整个Article模型,并且可以指定序列化哪些字段。
from rest_framework import serializers
from article.models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
# 序列化的模型
model = Article
# 需要序列化的字段
fields = ['title', 'desc', 'content']
6.重构DestroyModelMixin类中的perform_destroy方法
from django.shortcuts import render
from rest_framework import mixins, viewsets
from article.article_serializer import ArticleSerializer
from article.models import Article
class ArticleView(viewsets.GenericViewSet,
mixins.ListModelMixin,
mixins.DestroyModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.RetrieveModelMixin):
# 查询返回的数据
queryset = Article.objects.all().filter(is_delete=0)
# 序列化返回的文章数据
serializer_class = ArticleSerializer
def perform_destroy(self, instance):
instance.is_delete = 1
instance.save()
7.使用Ajax请求后端数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% csrf_token %}
<div id="content">
</div>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
$.ajax({
url:'/api/article/art',
type: 'GET',
dataType: 'json',
success: function (data) {
for(var i=0; i<data.length; i++){
s = '<p>标题:' + data[i].title + ' 描述:' + data[i].desc + ' 内容:'
+ data[i].content + '<a onclick="del_art(' + data[i].id + ')">删除</a></p>'
$('#content').append(s)
}
},
error: function (data){
alert('失败')
}
})
function del_art(id){
var csrf = $('input[name="csrfmiddlewaretoken"]').val()
$.ajax({
url: '/api/article/art/' + id +'/',
type: 'DELETE',
headers: {'X-CSRFToken': csrf},
dataType: 'json',
success: function (data) {
location.href='/api/article/list/'
},
error: function (data) {
alert('删除失败!')
}
})
}
</script>
</body>
</html>