Centos7 部署 Flask 啟動 RestFul API
官方文件地址: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 進行測試。