详解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中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
python连接MySQL数据库实例分析
May 12 Python
详细讲解Python中的文件I/O操作
May 24 Python
Python Property属性的2种用法
Jun 21 Python
python提取字典key列表的方法
Jul 11 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
Python3 关于pycharm自动导入包快捷设置的方法
Jan 16 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
python numpy数组复制使用实例解析
Jan 10 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
Python实现扫码工具的示例代码
Oct 09 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 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
拼音码表的生成
2006/10/09 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
php object转数组示例
2014/01/15 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
Python 内置变量和函数的查看及说明介绍
2019/12/25 Python
Python tkinter三种布局实例详解
2020/01/06 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
通过cmd进入python的步骤
2020/06/16 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
Yahoo-PHP面试题2
2014/12/06 面试题
什么是继承
2013/12/07 面试题
自我评价格式
2014/01/06 职场文书
捐款倡议书
2014/04/14 职场文书
开工仪式策划方案
2014/05/23 职场文书
建筑安全生产目标责任书
2014/07/23 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
出国留学英文自荐信
2015/03/25 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电
Python打包exe时各种异常处理方案总结
2021/05/18 Python
Go语言入门exec的基本使用
2022/05/20 Golang