Bootstrap

Flask优雅的使用教程(2):Resource

上一篇博客,讲述了flask最简单的接口实现demo:Flask优雅的使用教程(1):route

安装

pip install flask

pip install flask_restful

参数校对

在进行接口开发的时候,我们经常是提前约定好参数以及格式,这个时候,参数的校对就可以交给flask去做了,包括必要参数的检验、参数格式的检查等。

总的来说,一般参数的类型有以下几种:

  1. 普通的字符串、数值、数组等,直接设置对应的类型即可,如type=str
  2. json:包括json里面嵌套json或json数组,可以设置type=dict,直接解析为dict;
  3. json数组:这时,同样设置type=dict,但是需要增加action='append',否则只会得到一个json;
  4. required设置参数是否为必传。

在这里插入图片描述

具体代码

catch_all_404s:捕获如参数错误等的404错误类型,一旦404就不会进入代码模块,直接返回;

初始化工作不要放在__init__方法中,因为每次调用接口,都会实例化一个MyApi(Resource)对象。

# coding=utf-8
from flask import Flask
from flask_restful import Resource, reqparse, Api

# 一些初设化工作
print("do something")


class MyApi(Resource):
    """
    每次调用接口实际上是实例化一个MyApi(Resource)对象,所以初设化工作不能在__init__中
    """

    def __init__(self):
        # 接口参数
        self.parser = reqparse.RequestParser(bundle_errors=True)

        # json格式的参数,可以设置type=dict,直接解析为dict
        # json里嵌套json也同样适用
        self.parser.add_argument('para1', location=['json', 'args'], type=dict, trim=True, required=False)

        # json数组,需要设置action='append',否则只会捕获到一个json
        self.parser.add_argument('para2', location=['json', 'args'], type=dict, trim=True, required=False,
                                 action='append')

        # 但,如果是json里面嵌套json数组,则不需要设置action='append'

        self.parser.add_argument('para3', location=['json', 'args'], type=str, trim=True, required=True)
        self.parser.add_argument('para4', location=['json', 'args'], type=int, required=True)

        self.args = self.parser.parse_args()

        super(MyApi, self).__init__()

        print("__init__")

    def post(self):
        p1 = self.args['para1']
        p2 = self.args['para2']
        p3 = self.args['para3']
        p4 = self.args['para4']

        print("p1: {}\np2: {}\np3: {}\np4: {}".format(p1, p2, p3, p4))

        ret = {"message": "success", "status": 1, "data": [1, 2, 3]}

        return ret

    # def get(self):
    #     p1 = self.args['para1']
    #     p2 = self.args['para2']
    #     p3 = self.args['para3']
    #     p4 = self.args['para4']
    #
    #     ret = {"message": "success", "status": 1, "data": [1, 2, 3]}
    #
    #     return ret


if __name__ == '__main__':
    app = Flask(__name__)
    api = Api(app, catch_all_404s=True)
    api.add_resource(MyApi, '/api/test/', endpoint='my_api')
    app.run(host='0.0.0.0')

;