您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  要资料 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
 
   
 
  
每天15篇文章
不仅获得谋生技能
更可以追随信仰
 
     
   
 订阅
  捐助
Flask-RESTful构建小型REST服务
 
95 次浏览     评价:  
 2017-12-29  
 
编辑推荐:
本文来自于debugo.com,本文将会使用python的Flask框架轻松实现一个RESTful的服务。希望对大家的学习有帮助。

REST是web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了。诸如docker daemon等服务都是提供了RESTful API,docker的CLI可以通过该API的URL地址与之通信。

Flask是一个超级流行的Python 编写的轻量级 Web 应用框架。而Flask有一个REST插件——Flask-RESTful是为了快速构建REST API的Flask插件,它能和现有的ORM配合实现轻量级数据抽象。Flask-RESTful鼓励小型化实践,非常简单易学。

REST的六个特性:

Client-Server:服务器端与客户端分离。

Stateless:每次客户端请求必需包含完整的信息,换句话说,每一次请求都是独立的。

Cacheable(可缓存):服务器端必需指定哪些请求是可以缓存的。

Layered System(分层结构):服务器端与客户端通讯必需标准化,服务器的变更并不会影响客户端。

Uniform Interface(统一接口):客户端与服务器端的通讯方法必需是统一的。

Code on demand(按需执行代码):服务器端可以在上下文中执行代码

万事从Hello world起,

安装Flask-RESTful: pip install FLASK-RESTful

#-*- coding: utf-8 -*-
from flask import Flask
from flask.ext import restful

app = Flask(__name__)
api = restful.Api(app)

class HelloWorld(restful.Resource):
def get(self):
return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

if __name__ == '__main__':
app.run(debug=True)

相比普通的http服务:

区别在于:

1. import了RESTful的模块,并使用了restful Api。

2. REST资源类Hello world必须继承自restful.Resource,并实现/重写父类的一些方法(比如get)

3. 将Hello world添加到Restful api资源里,并没有使用装饰器。

下面是一个更复杂的实现,实现一个item列表的更新。HTTP中有相应的请求方法可以用于描述操作资源的动作:

下面我们设计一个复杂的REST API:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask
from flask.ext.restful import reqparse, Api, Resource, fields, marshal_with
from pymongo import MongoClient
mongo_url = 'your-ip'
db_name = 'your-db'
col_name = 'your-col'
client = MongoClient(mongo_url)
col = client[db_name][col_name]
col.remove({})
col.insert({'_id': 1, "name": "debugo", "values": [70, 65]})
col.insert({'_id': 2, "name": "leo", "values": [65]})
app = Flask(__name__)
api = Api(app)

parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True)
parser.add_argument('values', type=int, help='rate is a number', action='append')


class UserInfo(Resource):
def get(self):
return [str(i) for i in col.find({})]

def post(self):
args = parser.parse_args()
user_id = col.count() + 1
col.insert({'_id': user_id, "name": args["name"], "values": args["values"]})
return [str(i) for i in col.find({'_id': user_id})], 201

api.add_resource(UserInfo, '/')

if __name__ == '__main__':
app.run(debug=True)

其中我们定义了一个参数

新建一个请求解析器RequestParser,规定类型为type,否则会拒绝并提示help的信息:

在Chrome中使用Advanced REST Client这个应用来测试:

程序中成功输出下面请求结果:

127.0.0.1 – – [18/Jun/2015 18:09:23] “POST / HTTP/1.1″ 201 –
127.0.0.1 – – [18/Jun/2015 18:09:29] “GET / HTTP/1.1″ 200 –
   
 订阅
  捐助
相关文章

阻碍使用企业架构的原因及克服方法
世界级企业架构的行业挑战
企业架构和SOA架构的角色将融合
什么最适合您的组织?
相关文档

企业架构与ITIL
企业架构框架
Zachman企业架构框架简介
企业架构让SOA落地
相关课程

企业架构设计
软件架构案例分析和最佳实践
嵌入式软件架构设计—高级实践
企业级SOA架构实践
每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号