详解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实现简单截取中文字符串的方法
Jun 15 Python
Python读取图片属性信息的实现方法
Sep 11 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
python使用tkinter实现简单计算器
Jan 30 Python
详解Python函数式编程—高阶函数
Mar 29 Python
Python数据类型之Dict字典实例详解
May 07 Python
numpy concatenate数组拼接方法示例介绍
May 27 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
python nmap实现端口扫描器教程
May 28 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 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中获取文件扩展名的N种方法小结
2012/02/27 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
jquery禁用右键示例
2014/04/28 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
JS中Location使用详解
2015/05/12 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python微信公众号之关注公众号自动回复
2018/10/25 Python
python实现对输入的密文加密
2019/03/20 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
python实现简单颜色识别程序
2020/02/19 Python
基于python实现操作git过程代码解析
2020/07/27 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
速卖通欧盟:Aliexpress EU
2020/08/19 全球购物
就业自荐信
2013/12/04 职场文书
初婚未育未抱养证明
2014/01/12 职场文书
个人近期表现材料
2014/02/11 职场文书
《白鹅》教学反思
2014/04/13 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
2015暑假打工实践报告
2015/07/13 职场文书