REST是所有Web应用都应该遵守的架构设计指导原则。
Representational State Transfer,翻译是”表现层状态转化”。
REST核心: 资源, 状态转移, 统一接口
资源: 是REST最明显的特征,是指对某类信息实体的抽象,资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。
状态转移: 是指客户端痛服务端进行交互的过程中,客户端能够通过对资源的表述,实现操作资源的目的
统一接口: REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。 比如,客户端通过HTTP的4个请求方式(POST, GET, PUT, PATCH)来操作资源,也就意味着不管你的url是什么,不管请求的资源是什么但操作的资源接口都是统一的。
- GET用来获取资源,
- POST用来新建资源(也可以用于更新资源),
- PUT(PATCH)用来更新资源,
- DELETE用来删除资源。
get/post/put/patch/delete
post:创建
put:修改(修改全部属性)
patch:修改(修改部分属性)
delete:删除
django使用restful
安装
pip install djangorestframework==3.4.6
pip install django-filter # Filtering support
settings.py文件中配置
INSTALLED_APPS = [
...
'rest_framework',
]
在app的urls.py文件中配置路由
from django.conf.urls import url
from rest_framework.routers import SimpleRouter
from article import views
# 生成路由对象
router = SimpleRouter()
# 路由管理资源art
# http://127.0.0.1:8080/api/article/art/
router.register('art', views.ArticleView)
urlpatterns = [
]
# router.urls生成资源对应的路由地址
urlpatterns += router.urls
在视图views中定义类
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
自定义序列化类
from rest_framework import serializers
from article.models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
# 序列化的模型
model = Article
# 需要序列化的字段
fields = ['title', 'desc', 'content']
html页面内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
{% csrf_token %}
<div id="content">
</div>
<script>
$.ajax({
url: '/api/article/art/',
type: 'get',
dataType: 'json',
success: function (data) {
{#console.log(data)#}
for(var i=0; i < data.length; i++){
s = '标题: ' + data[i].title + '描述: '
+ data[i].desc + '内容: ' + data[i].content
+ '<button onclick="del_art(' + data[i].id + ')" >删除</button> <br>';
$('#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>