详解Django rest_framework实现RESTful API


Posted in Python onMay 24, 2018

一、什么是REST

面向资源是REST最明显的特征,资源是一种看待服务器的方式,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件、数据库中的一张表等等具体的东西,可以将资源设计的要多抽象有多抽象,只要想象力允许而且客户端应用开发者能够理解。

与面向对象设计类似,资源是以名词为核心来组织的,首先关注的是名词。一个资源可以由一个或多个URI来标识。URI既是资源的名称,也是资源在Web上的地址。对某个资源感兴趣的客户端应用,可以通过资源的URI与其进行交互。对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。

REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。(7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS)

二、什么是RESTful

API符合REST架构设计的API。

概念不多说了,具体通过下面的一个简单例子看看Django框架是怎么实现RESTful。

三、rest_framework模块

1.使用pip命令下载:pip3 install djangorestframework

详解Django rest_framework实现RESTful API

2.新建一个Django项目

详解Django rest_framework实现RESTful API

详解Django rest_framework实现RESTful API

3.创建一个apitest APP

cd d:\Tool           # 切换到Tool目录
python manage.py startapp apitest  #创建apitest应用

目录结构:

详解Django rest_framework实现RESTful API

4.打开settings.py,增加一段配置:

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'apitest',              #添加apitest app
  'rest_framework',          #添加rest_framework
]


#增加一段REST_FRAMEWORK配置
REST_FRAMEWORK = {
  # Use Django's standard `django.contrib.auth` permissions,
  # or allow read-only access for unauthenticated users.
  'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
  ],
  'DEFAULT_RENDERER_CLASSES': (
    'rest_framework.renderers.JSONRenderer',
  ),
  'DEFAULT_PARSER_CLASSES': (
    'rest_framework.parsers.JSONParser',
  )
}

5.在apitest目录下新建一个api.py,让我们来写一些测试代码:

#coding=utf-8
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.decorators import api_view, permission_classes
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
@api_view(http_method_names=['post'])        #只允许post
@permission_classes((permissions.AllowAny,))
def inventory(request):
  parameter = request.data
  id = parameter['data']
  if id == 1:
    data = 'There are three dogs'
  elif id == 2:
    data = 'There are two dogs'
  else:
    data = 'nothing'
  return Response({'data':data})

6.在urls.py添加刚刚创建的api路由:

urlpatterns = [
  path('admin/', admin.site.urls),
  path('food/', api.inventory),        #添加api中inventory路由
]

上面配置好了之后本地调试下,输入命令:python manage.py runserver 8000

详解Django rest_framework实现RESTful API

好了,服务器端代码已经写完。我们可以通过约定好的名词food来获取或者更改资源。然后写个小脚本测试下上面的接口:

import requests

url= 'http://127.0.0.1:8000/food/'
data = {'data':2}
h=requests.post(url,json=data)
print(h.text)

输出:

详解Django rest_framework实现RESTful API

测试OK

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
Python 爬虫图片简单实现
Jun 01 Python
python中subprocess批量执行linux命令
Apr 27 Python
运行django项目指定IP和端口的方法
May 14 Python
python 分离文件名和路径以及分离文件名和后缀的方法
Oct 21 Python
PyQtGraph在pyqt中的应用及安装过程
Aug 04 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
Python netmiko模块的使用
Feb 14 Python
详解django使用include无法跳转的解决方法
Mar 19 Python
使用Django清空数据库并重新生成
Apr 03 Python
python图片指定区域替换img.paste函数的使用
Apr 09 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
May 24 #Python
matplotlib 输出保存指定尺寸的图片方法
May 24 #Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
May 24 #Python
在Django中输出matplotlib生成的图片方法
May 24 #Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 #Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 #Python
好的Python培训机构应该具备哪些条件
May 23 #Python
You might like
php三维数组去重(示例代码)
2013/11/26 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
php封装的验证码类分享
2017/02/26 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
JavaScript驾驭网页-获取网页元素
2016/03/24 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
webpack+react+antd脚手架优化的方法
2018/04/02 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
python实现感知器
2017/12/19 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
详解flask表单提交的两种方式
2018/07/21 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
关于python中remove的一些坑小结
2021/01/04 Python
如何用Django处理gzip数据流
2021/01/29 Python
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
行政主管岗位职责
2013/11/18 职场文书
制药工程专业毕业生推荐信
2013/12/24 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
开展创先争优活动总结
2014/08/28 职场文书
办公室个人总结
2015/02/28 职场文书
给领导敬酒词
2015/08/12 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
Python 使用dict实现switch的操作
2021/04/07 Python
canvas多重阴影发光效果实现
2021/04/20 Javascript