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. Hibernate项目的创建

    首先,我们需要知道,Hibernate是一个不需要建立在容器的基础上的一个框架,所以在java项目中同样可以运行. 为了证明,我们在这次程序的创建中,用JavaProject文件来实现Hibernat ...

  2. js- caller、 callee

    caller 返回一个对函数的引用,该函数调用了当前函数.    functionName.caller     functionName对象 是所执行函数的名称.  说明        对于函数来说 ...

  3. Tail Recusive

    1.尾递归 double f(double guess){ if (isGoodEnough(guess)) return guess; else return f(improve(guess)); ...

  4. 学习Java JDBC,看这篇就够了

    JDBC (Java DB Connection)---Java数据库连接 JDBC是一种可用于运行SQL语句的JAVA API(ApplicationProgramming Interface应用程 ...

  5. Python学习笔记第二十周

    目录: 一.ORM 1.查询补充 备注:forloop.counter介绍 二.Ajax 三.ORM多对多操作 内容: 一.ORM 1.查询补充: 1.models.USR.objects.all() ...

  6. Arrays 类的 binarySearch() 数组查询方法详解

    Arrays类的binarySearch()方法,可以使用二分搜索法来搜索指定的数组,以获得指定对象.该方法返回要搜索元素的索引值.binarySearch()方法提供多种重载形式,用于满足各种类型数 ...

  7. MAC使用pycharm上传代码到Github上

    本人的电脑已经在GitHub中添加成功了SSH keys! 以下为在pycharm中上传代码到Github的步骤. Step1:打开pycharm,preferences---plugins(插件)选 ...

  8. AE旋转

    精准对位: 好几个图层上的旋转点在一个位置上: 方法1:勾选网格,定点. 方法2:按住ctrl+r  调出尺寸.拖参考线,焦点自动吸附功能. 选中四张或者选中第一张,按shift键,选中最后一张(即可 ...

  9. 02 http,servlet,servletconfig,HttpServletRequest ,HttpServletResponse

    Http协议 协议:双方在交互.通讯的时候, 遵守的一种规范.规则.http协议:针对网络上的客户端 与 服务器端在执行http请求的时候,遵守的一种规范. 其实就是规定了客户端在访问服务器端的时候, ...

  10. 通过更改服务器解决双系统ubuntu时间+8

    安装ntpdate: sudo apt-get install ntpdate 设置校正服务器: sudo ntpdate time.windows.com 设置硬件时间为本地时间: sudo hwc ...