详解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 相关文章推荐
Django1.7+python 2.78+pycharm配置mysql数据库教程
Nov 18 Python
Python XML RPC服务器端和客户端实例
Nov 22 Python
讲解Python中for循环下的索引变量的作用域
Apr 15 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
对pandas处理json数据的方法详解
Feb 08 Python
django drf框架自带的路由及最简化的视图
Sep 10 Python
TensorFlow实现checkpoint文件转换为pb文件
Feb 10 Python
使用Keras实现简单线性回归模型操作
Jun 12 Python
python 三种方法提取pdf中的图片
Feb 07 Python
Python基础之元类详解
Apr 29 Python
Python中for后接else的语法使用
May 18 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
Symfony页面的基本创建实例详解
2015/01/26 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
jQuery函数的等价原生函数代码示例
2013/05/27 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
python调用外部程序的实操步骤
2019/03/04 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
Django 路由层URLconf的实现
2019/12/30 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
恶意软件的定义
2014/11/12 面试题
主持人演讲稿范文
2013/12/28 职场文书
认识深刻的检讨书
2014/02/16 职场文书
反邪教警示教育方案
2014/05/13 职场文书
个性车贴标语
2014/06/24 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
安全生产月宣传标语
2014/10/06 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
小学主题班会教案
2015/08/17 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python