python实现RESTful服务(基于flask)

原文: https://www.jianshu.com/p/6ac1cab17929 

前言

上一篇文章讲到如何用java实现RESTful服务,这就来讲讲怎么用python来实现吧,因为要搭建一套java和python互调的服务,两者都不能少啊。
对于python的述求呢也是要轻量化,并且能快捷开发,因为我这套服务主要控制逻辑还是在java端,python这块负责一些工具逻辑,比如网页爬取、文字转拼音、图像处理等等,在java端当成工具类来使用,所以轻量和快捷开发就是重点了

web框架选择

java端需要选择一个web容器,同样的,python也需要选择一个web框架,当然自己实现一套也可以哈,不过本着【人生苦短,我用python】的原则,还是找框架吧

知乎上有一个讨论Python 有哪些好的 Web 框架?,从这个讨论中最后我选择了flask,原因是:

  • Django,流行但是笨重,还麻烦,人生苦短,肯定不选
  • web.py,轻量,但据说作者仙逝无人维护,好吧,先pass
  • tornado,据说倡导自己造轮子,虽然是facebook开源的吧,但听到这个,就算了吧
  • 还有一些其他的就不说了,直到看到一个人做了如下回复,就暂定了flask,再发现flask写RESTful居然超简单,于是就它了

     

撸代码

选定了flask框架,那就动手写代码咯


安装flask

pip install flask

hello world

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/9 from flask import Flask # Flask初始化参数尽量使用你的包名,这个初始化方式是官方推荐的,官方解释:http://flask.pocoo.org/docs/0.12/api/#flask.Flask
app = Flask(__name__) @app.route('/HelloWorld')
def hello_world():
return "Hello World!" if __name__ == "__main__":
# 这种是不太推荐的启动方式,我这只是做演示用,官方启动方式参见:http://flask.pocoo.org/docs/0.12/quickstart/#a-minimal-application
app.run(debug=True)

注:代码里参见的官方文档都是英文的,也有一个不错的中文网站做了很好的翻译,可以在扎个上面找到很好的对应:
http://www.pythondoc.com/flask/quickstart.html

验证结果:
  • PostMan验证

     
    PostMan验证
  • 浏览器打开

     
    浏览器打开

完美!!!就这几行代码就实现了一个简单的网页,简直爽得不要不要的了


简单的RESTful实现

光实现一个简单网页可不是本事(毕竟python用SimpleHTTPServer都可以不用写代码),实现RESTful是不是也同样简单呢?

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/9
from flask import Flask, abort, request, jsonify app = Flask(__name__) # 测试数据暂时存放
tasks = [] @app.route('/add_task/', methods=['POST'])
def add_task():
if not request.json or 'id' not in request.json or 'info' not in request.json:
abort(400)
task = {
'id': request.json['id'],
'info': request.json['info']
}
tasks.append(task)
return jsonify({'result': 'success'}) @app.route('/get_task/', methods=['GET'])
def get_task():
if not request.args or 'id' not in request.args:
# 没有指定id则返回全部
return jsonify(tasks)
else:
task_id = request.args['id']
task = filter(lambda t: t['id'] == int(task_id), tasks)
return jsonify(task) if task else jsonify({'result': 'not found'}) if __name__ == "__main__":
# 将host设置为0.0.0.0,则外网用户也可以访问到这个服务
app.run(host="0.0.0.0", port=8383, debug=True)
验证结果
 
add_task
 
get_task
 
get_task by id

以上是通过最原始的方式实现,没有使用flask的RESTful扩展库,就这种实现方式都已经非常给力了,这么一点代码就搞定了RESTful服务,真的是人生苦短啊,但这真的就完美了吗?
答案肯定是no啦~ 必须要试试flask的RESTful扩展库才知道什么叫真正的爽啊


使用flask的RESTful扩展库 flask-restful

强烈建议参考官方文档(因为下面我也是照搬不误):http://flask-restful.readthedocs.io/en/0.3.5/quickstart.html#a-minimal-api

安装flask-restful
pip install flask-restful
demo
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/9
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource app = Flask(__name__)
api = Api(app) TODOS = {
'todo1': {'task': 'build an API'},
'todo2': {'task': '哈哈哈'},
'todo3': {'task': 'profit!'},
} def abort_if_todo_doesnt_exist(todo_id):
if todo_id not in TODOS:
abort(404, message="Todo {} doesn't exist".format(todo_id)) parser = reqparse.RequestParser()
parser.add_argument('task') # Todo
# shows a single todo item and lets you delete a todo item
class Todo(Resource):
def get(self, todo_id):
abort_if_todo_doesnt_exist(todo_id)
return TODOS[todo_id] def delete(self, todo_id):
abort_if_todo_doesnt_exist(todo_id)
del TODOS[todo_id]
return '', 204 def put(self, todo_id):
args = parser.parse_args()
task = {'task': args['task']}
TODOS[todo_id] = task
return task, 201 # TodoList
# shows a list of all todos, and lets you POST to add new tasks
class TodoList(Resource):
def get(self):
return TODOS def post(self):
args = parser.parse_args()
todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1
todo_id = 'todo%i' % todo_id
TODOS[todo_id] = {'task': args['task']}
return TODOS[todo_id], 201 ##
## Actually setup the Api resource routing here
##
api.add_resource(TodoList, '/todos')
api.add_resource(Todo, '/todos/<todo_id>') if __name__ == '__main__':
app.run(debug=True)
验证结果

查询列表:

 
get

查询单任务:

 
get by id

删除任务:

 
delete by id

添加任务(这是用post表单形式,还可以改成json形式啦):

 
add

更新任务:

 
update
flask-restful框架使用总结

这个框架用Resource类将封装好了http的各种请求,只需定义一下对应的函数即可,返回值也是可以直接丢对象过去,非常方便,写好接口类用API配置一下路径就搞定了

后语

Perfect!!!经过这一番测试,flask-restful完全满足了我的需求,框架轻量,开发方便,以class为单位去开发我的各个接口给到java调用,果然是【人生苦短,我用python】啊~

[转]python实现RESTful服务(基于flask)的更多相关文章

  1. python实现Restful服务 (基于flask)(1)

    参考:https://www.jianshu.com/p/6ac1cab17929 参考:https://www.cnblogs.com/alexyuyu/p/6243362.html 参考:http ...

  2. python实现RESTful服务(基于flask)

    https://www.jianshu.com/p/6ac1cab17929 http://www.pythondoc.com/flask/quickstart.html 在java中调用python ...

  3. python实现Restful服务(基于flask)(2)

    参考:https://blog.csdn.net/yelena_11/article/details/53404892 最简单的post例子: from flask import Flask, req ...

  4. python之restful api(flask)获取数据

    需要用到谷歌浏览器的扩展程序 Advanced Rest Client进行模拟请求 1.直接上代码 from flask import Flask from flask import request ...

  5. 实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务

    本文为实战SpringCloud响应式微服务系列教程第九章,讲解使用Spring WebFlux构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 从本节开始我们 ...

  6. Python flask 基于 Flask 提供 RESTful Web 服务

    转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...

  7. XData -–无需开发、基于配置的数据库RESTful服务,可作为移动App和ExtJS、WPF/Silverlight、Ajax等应用的服务端

    XData -–无需开发.基于配置的数据库RESTful服务,可作为移动App和ExtJS.WPF/Silverlight.Ajax等应用的服务端   源起一个App项目,Web服务器就一台,已经装了 ...

  8. 基于SpringBoot开发一个Restful服务,实现增删改查功能

    前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...

  9. 基于TypeScript装饰器定义Express RESTful 服务

    前言 本文主要讲解如何使用TypeScript装饰器定义Express路由.文中出现的代码经过简化不能直接运行,完整代码的请戳:https://github.com/WinfredWang/expre ...

随机推荐

  1. [译]TensorFlow入门

    TensorFlow入门 张量(tensor) Tensorflow中的主要数据单元是张量(tensor), 一个张量包含了一组基本数据,可以是列多维数据.一个张量的"等级"(ra ...

  2. 快排 - 快速排序算法 (Chinar出品 简单易懂)

    Quicksort 快排的简单讲解 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  3. 完整的AJAX

    $.ajax({url:"请求路径",data:{"key":前端传入后台处理的数据},type:"post", //请求方式dataTyp ...

  4. VMware安装CentOS以及CentOS的一些配置

    转:http://blog.csdn.net/u013082989/article/details/51911330

  5. (7)MySQL的事务

    什么是事物: 作用:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像 ...

  6. ACM-ICPC 2018 徐州赛区网络预赛(9.9)

    #include<bits/stdc++.h> #define int long long using namespace std; ; ; ]; int quick(int a,int ...

  7. json(传输格式)、异步加载、时间线

    xml:过去传输的数据格式 json:现在的传输数据格式,属性名加双引号来区别,其实也是对象,传输的是个字符串,其实就是json 前端JSON.stringfy(obj) 然后传给后台 后台传回来的j ...

  8. url中携带中文乱码问题

    1.问题描述 在项目中碰见url中经常传递中文参数时,容易出现乱码问题,现在就这个问题产生原因和解决的措施大概分析一下,希望过路人和我能引以为戒. 2.问题分析 由于我们利用URL传递参数这种方式是依 ...

  9. 简单说明 Virtual DOM 为啥快

    Virtual DOM 就是用 JS 的对象来描述 DOM 结构的一个 DOM 树.如: var element = { tagName: 'ul', // 节点标签名 props: { // DOM ...

  10. ios-密码加密

    加密文件可到网上搜索MyMD5后下载 MyMD5.h文件 // // MyMD5.h // GoodLectures // // Created by yangshangqing on 11-10-1 ...