第十屆鐵人賽 flask-restful DAY19-搞懂flask-marshmallow的導入

導入flask-marshmallow

昨日的內容教授大家如何透過POSTMAN來保護我們的程式,今日的內容就在處理之前遇到的BUG。這裡介紹大家一個新的函式庫flask-marshmallow,透過此函式庫可以讓我們的程式在處理請求參數更彈性,接下來就進入我們今天的教程。

回顧截至目前的程式碼

以下先讓大家回顧一下目前的程式碼:

from flask_restful import Resource, reqparse

users = [{
    'name': 'kirai',
}]


class User (Resource):

    parser = reqparse.RequestParser()
    parser.add_argument('email', required=True, help='Email is required')
    parser.add_argument('password', required=True, help='Password is required')

    def get(self, name):
        find = [item for item in users if item['name'] == name]
        if len(find) == 0:
            return {
                'message': 'username not exist!'
            }, 403
        user = find[0]
        if not user:
            return {
                'message': 'username not exist!'
            }, 403
        return {
            'message': '',
            'user': user
        }

    def post(self, name):
        arg = self.parser.parse_args()
        user = {
            'name': name,
            'email': arg['email'],
            'password': arg['password']
        }
        global users
        users.append(user)
        return {
            'message': 'Insert user success',
            'user': user
        }

    def put(self, name):
        arg = self.parser.parse_args()
        find = [item for item in users if item['name'] == name]
        if len(find) == 0:
            return {
                'message': 'username not exist!'
            }, 403
        user = find[0]
        user['email'] = arg['email']
        user['password'] = arg['password']
        return {
            'message': 'Update user success',
            'user': user
        }

    def delete(self, name):
        global users
        users = [item for item in users if item['name'] != name]
        return {
            'message': 'Delete done!'
        }


class Users(Resource):
    def get(self):
        return {
            'message': '',
            'users': users
        }

大家還記得我們之前遇到新增以及更新使用者所遇到的問題嗎,那就是目前的寫法沒有辦法驗證email以及password資料的正確性,頂多只能確定使用者有提交此參數,所以這裡我們要介紹一個套件來取代原來flask-restul內建的reqparse。

安裝

安裝的方法很簡單就是輸入以下指令即可:

pip install flask-marshmallow

基本介紹

在使用flask-marshmallow之前先告訴大家甚麼是flask-marshmallow,這函式庫其實也沒太大的學問,僅是將marshmallow與flask整合起來而已,所以其主要內容還是要參照marshmallow的api。

初始設定

在安裝完flask-marshmallow後要處理的是如何在我們的flask-restful加入flask-marshmallow的函式庫,這邊為了我們後續開發方便我們先新增一個ma.pycommon資料夾內,檔案的內容如下:

from flask_marshmallow import Marshmallow

ma = Marshmallow()

為什麼我們要做這個動作呢,主要是為了避免以後的開法產生循環參考的狀況,因為在後續的動作很常會使用到ma這個實體。

加入應用程序內

在設定好flask_marshmallow後要把flask_marshmallow加到我們的flask-restfut應用程序之中,首先先列出截至目前為止app.py如下:

from flask import Flask
from flask_restful import Api

from resources.user import User

app = Flask(__name__)
api = Api(app)

api.add_resource(User, "/user/<string: name>")

if __name__ == "__main__":
    app.run()

而加入flask_marshmallow的方式就是將原先app.py修下內容如下:

from flask import Flask
from flask_restful import Api

from resources.user import User

app = Flask(__name__)
api = Api(app)

api.add_resource(User, "/user/<string: name>")

if __name__ == "__main__":
    from common.ma import ma
    ma.init_app(app)
    app.run()

如此我們就可以在專案中使用flask_marshmallow來解析我們接收到的請求參數。

小結

今日的內容主要是告訴大家之前的程序有些甚麼問題,還有提出我們可以透過flask_marshmallow來解決這問題,並且教授大家如何在原來的程序之中加入flask_marshmallow。不過截至目前為止還沒有說到flask_marshmallow如何使用,這部分待明日在告訴大家如何使用,敬請期待。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *