我正在设置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)
答案 0 :(得分:0)
据我了解,如果要确保在入口点拥有所需的所有键,则需要使用RequestParser()
。 api.expect()
装饰器用于记录摇摇欲坠。
但是,如果要确保请求始终返回一个基本模板(类似于此处的模型),则可以使用在装饰器api.marshal_with()
中创建的模型。
例如,在此处的示例中,只需将expect
替换为marshal_with
,它将在响应中包含缺少的值。
答案 1 :(得分:0)
我认为如果没有请求解析器,就无法获得想要的东西。此默认关键字实际上不是答案。因为如果您尝试使用Logs进行调试,它只会接收您作为查询传递的内容。但是api不会在缺少大小写的情况下添加默认参数,“必需”参数在那里也无法正常工作。所以我想按@IMCoins的说明使用它?
答案 2 :(得分:-1)
jsonschema实际上对此有一个解决方案...但是不在主库中包括它
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}