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. 2D转换下的zoom和transform:scale的区别

    一.什么是zoom 在我们做项目和查看别人的网页的时候总会在一些元素的样式里,看到有一个家伙孤零零的待在那里,它到底是谁呢? 它的名字叫zoom,zoom的意思是“变焦”,虽然在摄影的领域经常被提到, ...

  2. 关于DDOS的主动与智能防御

    -   善守者藏于九地之下    - -  狡兔九窟 - 一.分配足够多的网关服务器 让用户总一个终点,可以进入游戏.多分配,动态分配,定期更新 二.用户分组分级 分组可以根据用户的生成时间, 在线时 ...

  3. CentOS中yum安装ffmpeg

    1.升级系统 sudo yum install epel-release -y sudo yum update -y sudo shutdown -r now 2.安装Nux Dextop Yum 源 ...

  4. Linux大文件分割splite

    /********************************************************************** * Linux大文件分割splite * 说明: * 编 ...

  5. np.tile语法

    >>> v = np.array([1, 0, 1])>>> vv = np.tile(v,(4,1))>>> print vv[[1 0 1] ...

  6. Python urllib.quote

    转: 编码:urllib.quote(string[, safe]),除了三个符号“_.-”外,将所有符号编码,后面的参数safe是不编码的字符, 使用的时候如果不设置的话,会将斜杠,冒号,等号,问号 ...

  7. 检测IP地址冲突的shell脚本-check_server_ip_conflict.sh

    check_server_ip_conflict.sh 使用arping获取对应IP地址的MAC地址,如果和预料的不一致则报警: #!/bin/bash epg_addr_01="00:50 ...

  8. [LeetCode&Python] Problem 705. Design HashSet

    Design a HashSet without using any built-in hash table libraries. To be specific, your design should ...

  9. Nginx + php-fpm

    www.example.com | | Nginx | | 路由到www.example.com/index.php | | 加载nginx的fast-cgi模块 | | fast-cgi监听127. ...

  10. python os模块使用笔记(更新)

    import os 添加os模块 walk方法: os.walk(path) path是string形式的目标目录 生成一个某目录下递归树形目录迭代器,方便递归访问子目录,访问目录就能够轻松访问子文件 ...