官方文档地址:Flask-Resuful 官方文档
经常见到的Restful内容如下:
========== ===================== ==================================
HTTP 方法 行为 示例
========== ===================== ==================================
GET 获取资源的信息 http://example.com/api/orders
GET 获取某个特定资源的信息 http://example.com/api/orders/123
POST 创建新资源 http://example.com/api/orders
PUT 更新资源 http://example.com/api/orders/123
DELETE 删除资源 http://example.com/api/orders/123
========== ====================== ==================================
而我们设计Restful的时候要根据以下案例进行设置:
========== =============================================== =============================
HTTP 方法 URL 动作
========== =============================================== ==============================
GET http://[hostname]/todo/api/v1.0/tasks 检索任务列表
GET http://[hostname]/todo/api/v1.0/tasks/[task_id] 检索某个任务
POST http://[hostname]/todo/api/v1.0/tasks 创建新任务
PUT http://[hostname]/todo/api/v1.0/tasks/[task_id] 更新任务
DELETE http://[hostname]/todo/api/v1.0/tasks/[task_id] 删除任务
========== ================================================ =============================
hostname 即主机名
port 默认不修改则为80,可以不填写的,如果有修改的话,务必填写修改的端口号
下面是通用的经典代码:
from flask import Flask, abort, make_response, request, url_for
from flask import jsonify
app = Flask(__name__)
tasks = [
{
'id': 1,
'title': '我是tasks数组中的成员 No1',
'description': 'No1的desc',
'done': False
},
{
'id': 2,
'title': '我是tasks数组中的成员 No2',
'description': 'No2的desc',
'done': False
}
]
@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404)
@app.route('/hyl/api/v1.0/tasks', methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})
@app.route('/hyl/api/v1.0/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
task = list(filter(lambda t: t['id'] == task_id, tasks))
if len(task) == 0:
abort(404)
return jsonify({'task': task[0]})
@app.route('/hyl/api/v1.0/tasks', methods=['POST'])
def create_task():
print(request.json)
if not request.json or not 'title' in request.json:
abort(400)
task = {
'id': tasks[-1]['id'] + 1,
'title': request.json['title'],
'description': request.json.get('description', ""),
'done': False
}
tasks.append(task)
return jsonify({'task': task}), 201
@app.route('/hyl/api/v1.0/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):
task = list(filter(lambda t: t['id'] == task_id, tasks))
if len(task) == 0:
abort(404)
if not request.json:
abort(400)
if 'done' in request.json and type(request.json['done']) is not bool:
abort(400)
task[0]['title'] = request.json.get('title', task[0]['title'])
task[0]['description'] = request.json.get('description', task[0]['description'])
task[0]['done'] = request.json.get('done', task[0]['done'])
return jsonify({'task': task[0]})
@app.route('/hyl/api/v1.0/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
task = list(filter(lambda t: t['id'] == task_id, tasks))
if len(task) == 0:
abort(404)
tasks.remove(task[0])
return jsonify({'result': True})
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0', port=9000)
与django不同的是,django需要通过urls.py文件,将浏览器的访问路径和视图函数views进行绑定。
而在上面的flask代码中:则是通过@app.route(路由规则) 的方式绑定视图函数, methods 初始为None
虽有差异,但理解起来应该不难。
其次是项目的启动,与django相同的是程序的主入口都是main函数。
django的host设置、端口设置、debug设置都在setting.py文件中,程序的启动则在manage.py文件中。
而flask的上述设置在app.run方法中,启动则在name=main的方法里。
接下来是,环境配置:
1.安装Flask
pip install flask (我这里已经安装过)
2. 使用gunicorn 启动 flask项目:
切换到flask目录(我这里的flask目录在svn下面):
启动项目时,flask和django是不太一样的,django项目中gunicorn会去找manage.py。
而flask则要指定所要运行的文件及其主函数:
gunicorn -w4 flask_Demo:app -b0.0.0.0:8000
打开浏览器,访问127.0.0.1:8000:
没有问题,访问flask中的其他url地址:
配置nginx:
在nginx 的conf配置中,发现其监听的端口号为8000,而gunicorn也是8000,产生冲突。
返回到flask.demo目录,重新用gunicorn 启动,端口则改为8080
gunicorn -w4 flask_Demo:app -b0.0.0.0:8080
启动完成过,启动nginx,nginx配置如下;
这时用8000端口访问,显示如下:
至此,使用flask 编写的简单demo运行ok,
上述例子中未进行post、delete、put测试。
想要测试可以使用postman 或者 curl 进行测试。