如何将默认值传递给flask-restplus中的有效负载?

时间:2019-07-17 11:31:19

标签: python flask flask-restplus

我正在设置restplus API,如果查询中不包含这些值,则希望传递一些默认字段。如何使用api模型传递这些信息,最好不使用requestParser?

按目前的样子,有效负载不会受到设置默认值的影响,因此使其不必要。我尝试过将参数设为必需,但这没有用,因为我只希望传递期望的有效载荷的一部分。

from flask import Flask, request
from flask_restplus import Api, Resource, fields

app = Flask(__name__)
api = Api(app=app)
model = api.model("simple_model", {'some_bool': fields.Boolean(required=False, default=False),
                                   'some_int': fields.Integer(required=False, default=99)})


@api.route('/foo')
class SomeClass(Resource):

    @api.expect(model)
    def post(self):
        return request.json


if __name__ == '__main__':
    app.run(host='localhost', port=8000, threaded=False, debug=True)

使用代码进行测试

import requests

query = {"some_bool": True, "some_int": 20}
res = requests.post("http://localhost:8000/foo", json=query)
print(res.json())

query = {"some_bool": True}
res = requests.post("http://localhost:8000/foo", json=query)
print(res.json())

query = {"some_int": 20}
res = requests.post("http://localhost:8000/foo", json=query)
print(res.json())

res = requests.post("http://localhost:8000/foo")
print(res.json())

这给出了输出

{'some_bool': True, 'some_int': 20}

{'some_bool': True}

{'some_int': 20}
None

期望值和期望的输出是

{'some_bool': True, 'some_int': 20}

{'some_bool': True, 'some_int': 99}

{'some_bool': False, 'some_int': 20}

{'some_bool': False, 'some_int': 99}

感谢所有帮助。

编辑:

在@IMCoins回答之后,我想写一个函数使我能够像这样访问函数中的项

def get_content(api_model):
   @marshal_with(api_model)
   def get_request():
      return request.json
   return get_request()

然后只需以

的身份访问其中的内容
content = get_content(model)

3 个答案:

答案 0 :(得分:0)

据我了解,如果要确保在入口点拥有所需的所有键,则需要使用RequestParser()api.expect()装饰器用于记录摇摇欲坠。

但是,如果要确保请求始终返回一个基本模板(类似于此处的模型),则可以使用在装饰器api.marshal_with()中创建的模型。

例如,在此处的示例中,只需将expect替换为marshal_with,它将在响应中包含缺少的值。

答案 1 :(得分:0)

我认为如果没有请求解析器,就无法获得想要的东西。此默认关键字实际上不是答案。因为如果您尝试使用Logs进行调试,它只会接收您作为查询传递的内容。但是api不会在缺少大小写的情况下添加默认参数,“必需”参数在那里也无法正常工作。所以我想按@IMCoins的说明使用它?

答案 2 :(得分:-1)

jsonschema实际上对此有一个解决方案...但是不在主库中包括它

https://python-jsonschema.readthedocs.io/en/stable/faq/#why-doesn-t-my-schema-s-default-property-set-the-default-on-my-instance

schema = {'some_bool' {'type': 'bool', 'default': 'false'}, 'some_int': {'type': 'number', 'default': 99}}

def post()
   data = request.json
   DefaultValidatingDraft7Validator(schema).validate(data)
   return data

应该导致

res = requests.post("http://localhost:8000/foo")
print(res.json())
{'some_bool': False, 'some_int': 99}