对Django的restful用法详解(自带的增删改查)


Posted in Python onAugust 28, 2019

什么是rest

REST是所有Web应用都应该遵守的架构设计指导原则。

Representational State Transfer,翻译是”表现层状态转化”。

面向资源是REST最明显的特征,对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。

REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。

GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT(PATCH)用来更新资源,DELETE用来删除资源。

api定义规范

http://xxx.com/api/

资源

在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的”集合”(collection),所以API中的名词也应该使用复数。

举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。

https://api.example.com/v1/zoos

https://api.example.com/v1/animals

https://api.example.com/v1/employees

http请求方式

GET(SELECT):从服务器取出资源(一项或多项)

POST(CREATE):在服务器新建一个资源

PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)

PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)

DELETE(DELETE):从服务器删除资源

filter过滤

?page=2&per_page=100:指定第几页,以及每页的记录数。

?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。

?animal_type_id=1:指定筛选条件

状态码

服务端向用户返回请求api的结果,在结果中包含了status codes 状态码的,可以通过状态码去判断请求api的状态是成功还是失败

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。

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 - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。

406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。

410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。

422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。

500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

具体用法

更多的需要配合postman 因此需要下载一个postman,方便更多的操作

https://www.getpostman.com/apps

使用之前安装模块

pip install djangorestframework 
pip install django-filter

在setting.py中加入参数

INSTALLED_APPS中加入'rest_framework',

在app中创建一个py文件——序列化文件

比如serializers.py然后写入restful
from rest_framework import serializers
from stu.models import Student(导入自己写的app、models)


class StudentSerializer(serializers.ModelSerializer):

  class Meta:
    # 关联数据表(前面不是变量名)
    model = Student
    # 确定需要序列化的字段(返回给用户的具体表中的字段)(前面不是变量名)
    fields = ['id', 's_name', 's_tel']

  def to_representation(self, instance):

    data = super().to_representation(instance)

    try:
      # 得到关联表中的字段,必须用try,否则如果存在一个没有定义i_addr的学生时,系统将报错
      data['s_addr'] = instance.studentinfo.i_addr
    except Exception as e:
      data['s_addr'] = ''

    return data

在app中views中创建类

from rest_framework import mixins,viewsets
from stu.serializers import StudentSerializer
from stu.models import Student


class StudentEdit(mixins.ListModelMixin,# 表示可以在Postman类似的软件中只能查找所有数据
         viewsets.GenericViewSet,
         mixins.RetrieveModelMixin, # 表示可以在Postman类似的软件中只能查找单一数据
         mixins.UpdateModelMixin,  # 表示可以在Postman类似的软件中更新数据
         mixins.DestroyModelMixin,  # 表示可以在Postman类似的软件中删除数据
         mixins.CreateModelMixin):  # 表示可以在Postman类似的软件中创建数据

  # 查询所有信息
  queryset = Student.objects.all()
  # 序列化
  serializer_class = StudentSerializer

对Django的restful用法详解(自带的增删改查)

创建urls

这里同时展示了urls不一定每次都写入进去可以用+=添加进去

注意这里写的urls不要加‘/'他会自动加载

from stu import views
from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register(r'student', views.StudentEdit)

urlpatterns = [
  # 其他url
]

urlpatterns += router.urls #这里表示添加定义的url

对Django的restful用法详解(自带的增删改查)

对应的方法

在postman中选入某个参数然后传入某个urls即可

增: POST http://127.0.0.1:8080/stu/addStu/1/

删: DELETE http://127.0.0.1:8080/stu/addStu/1/

改: UPDATE http://127.0.0.1:8080/stu/addStu/1/

查: GET http://127.0.0.1:8080/stu/addStu/1

能执行这些操作前都需要在views中定义好才行

以上这篇对Django的restful用法详解(自带的增删改查)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的Flask框架的简介和安装方法
Nov 13 Python
详解python单例模式与metaclass
Jan 15 Python
python 创建弹出式菜单的实现代码
Jul 11 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
解决项目pycharm能运行,在终端却无法运行的问题
Jan 19 Python
Python高级特性 切片 迭代解析
Aug 23 Python
python爬虫 正则表达式解析
Sep 28 Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 Python
pytorch 自定义参数不更新方式
Jan 06 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 Python
Python中time与datetime模块使用方法详解
Mar 31 Python
Python closure闭包解释及其注意点详解
Aug 28 #Python
python opencv调用笔记本摄像头
Aug 28 #Python
Python threading的使用方法解析
Aug 28 #Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 #Python
Python logging设置和logger解析
Aug 28 #Python
Python shelve模块实现解析
Aug 28 #Python
解决python明明pip安装成功却找不到包的问题
Aug 28 #Python
You might like
php操作SVN版本服务器类代码
2011/11/27 PHP
ThinkPHP安装和设置
2015/07/27 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
浅谈javascript中replace()方法
2015/11/10 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
python与字符编码问题
2019/05/24 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
小学教师节活动方案
2014/01/31 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS