详解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中fileno()方法的使用
May 24 Python
Python中Django 后台自定义表单控件
Mar 28 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
朴素贝叶斯Python实例及解析
Nov 19 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
django创建超级用户过程解析
Sep 18 Python
python标准库OS模块函数列表与实例全解
Mar 10 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
python 下载m3u8视频的示例代码
Nov 11 Python
pycharm 实现光标快速移动到括号外或行尾的操作
Feb 05 Python
python基础详解之if循环语句
Apr 24 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
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
python全栈知识点总结
2019/07/01 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
Python线程指南分享
2019/11/19 Python
基于python实现音乐播放器代码实例
2020/07/01 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
《花的勇气》教后反思
2014/02/12 职场文书
目标管理责任书
2014/04/15 职场文书
公司授权委托书
2014/10/17 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
Django中的JWT身份验证的实现
2021/05/07 Python
Django框架中视图的用法
2022/06/10 Python
MySQL常用慢查询分析工具详解
2022/08/14 MySQL