详解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交换变量
Sep 06 Python
python中遍历文件的3个方法
Sep 02 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
详解TensorFlow查看ckpt中变量的几种方法
Jun 19 Python
Appium+python自动化怎么查看程序所占端口号和IP
Jun 14 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
python对文件的操作方法汇总
Feb 28 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
Mar 17 Python
Python库安装速度过慢解决方案
Jul 14 Python
Python 绘制多因子柱状图
May 11 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
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
php身份证号码检查类实例
2015/06/18 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
jquery图片上下tab切换效果
2011/03/18 Javascript
你必须知道的Javascript知识点之"单线程事件驱动"的使用
2013/04/23 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
JavaScript字符集编码与解码详谈
2017/02/02 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
2020/03/31 Javascript
node.js如何根据URL返回指定的图片详解
2020/10/21 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
python的scipy实现插值的示例代码
2019/11/12 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
自荐信格式的六要素
2013/09/21 职场文书
留学自荐信的技巧
2013/10/17 职场文书
优秀教师主要事迹
2014/02/01 职场文书
python 进阶学习之python装饰器小结
2021/09/04 Python
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android
Flink 侧流输出源码示例解析
2022/09/23 Servers