1. 程式人生 > >Centos7 部署 Flask 啟動 RestFul API

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 進行測試。