使用Python和Flask设计RESTful API(一)
首先设计RESTful API这件事,用Django和Flask都可以,但是Flask这个框架是专门用来设计API的,入门也更简单,也更符合前后端分离的大趋势。什么是前后端分离,比如Django来设计的网页,那就不叫前后端分离,它的页面展示和逻辑处理都放在了一块,而前后端分离,是后端负责提供API,不负责页面展示的。
要使用Flask得步骤:
pip install flask
安装好了以后,就可以直接新建一个Flask的文件了。
![](https://img.haomeiwen.com/i3072403/fc5e851845920bcf.png)
比如我这里新建好之后,就是这样的工程结构,比Django看起来简洁很多。其中的初始代码为
#!flask/bin/python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello, World!"
if __name__ == '__main__':
app.run(debug=True)
执行这段代码,run起来后,按照log中的提示访问localhost:5000就好了。页面会展示一个Hello,World。好了接下来要正式写json接口了。
先上代码:
#!flask/bin/python
from flask import Flask, jsonify
app = Flask(__name__)
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})
if __name__ == '__main__':
app.run(debug=True)
代码很容易理解,其中的jsonify是什么意思?
这个函数的响应不是文本,我们使用 JSON 数据格式来响应,Flask 的 jsonify 函数从我们的数据结构中生成。
接下来是难度升级,如何实现根据不同的id请求来返回不同的json数据。更换路由部分的代码:
from flask import abort
@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
task = filter(lambda t: t['id'] == task_id, tasks)
if len(task) == 0:
abort(404)
return jsonify({'task': task[0]})
浏览器访问这个地址http://localhost:5000/todo/api/v1.0/tasks/2
,会返回task中id为2的json数据,如果访问地址为http://localhost:5000/todo/api/v1.0/tasks/3
,因为其中没有数据,所以会报404.
就其中的代码,有难度的地方在于lambda函数。
简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。先举一个普通的 Python 例子:将一个 list 里的每个元素都平方:
map( lambda x: x*x, [y for y in range(10)] )
这个写法要好过
def sq(x):
return x * x
map(sq, [y for y in range(10)])
lambda t: t['id'] == task_id, tasks
的意思就容易理解了,返回tasks中数据id为请求中的id的task。
可以自己定制测试数据来用了,对于前端和测试来说,尽管mock也能做这样的事情。