在 Flask-Restplus 中,我需要建模一个属性值,它可能是一个字符串列表或一个对象列表。
也就是说它看起来像这样:
{
'my_attribute': [
'value1',
'value2'
]
}
Run Code Online (Sandbox Code Playgroud)
或者它可以如下所示:
{
'my_attribute': [
{
'name': 'value1',
'foo': 'something'
},
{
'name': 'value2',
'foo': 'something else'
}
]
}
Run Code Online (Sandbox Code Playgroud)
我应该如何在 Flask-Restplus' 中建模api.model?
我有问题将装饰器应用到我的Resource.该Api decorators参数被应用到每个资源功能或怎么做我已经明白了decorators参数?我的装饰器仅在启动时应用,而不是在每个函数调用时应用.我究竟做错了什么?
from flask import Flask, Blueprint
from flask.ext.restplus import Api, Resource, fields
app = Flask(__name__)
def my_decorator(input):
print("my decorator")
return input
api_blueprint = Blueprint('index', __name__, url_prefix='/0')
api = Api(api_blueprint, version='0.1.0', title='Index API',
description='The Index API helps to find things faster in the own database',
# ui=False,
decorators=[my_decorator]
)
app.register_blueprint(api_blueprint)
ns = api.namespace('index', description='Index API')
search_id_score_model = api.model('id', {
'id': fields.String(required=True),
'score': fields.Float(required=True)
})
search_result_model = api.model('result', {
'key': fields.String(required=True),
'ids': fields.List(fields.Nested(search_id_score_model, required=True), required=True) …Run Code Online (Sandbox Code Playgroud) 我正在使用flask-restful构建API.我也使用flask-resfulplus来生成swagger文档.我想返回一个项目字典,其中密钥将根据项目而变化.我的模型看起来像这样:
item = api.model('Item',{
'item':fields.Integer()}) <- This is wrong
ItemModel = api.model('ItemsList', {
'_header': fields.Nested(_header),
'items':fields.Nested(item)
})
Run Code Online (Sandbox Code Playgroud)
请注意,我尝试了一些变体,但似乎没有任何作用; 这只是最新的互动.
我正在寻找的回应是这样的.
{
'_header':{} <-This works fine
'items': {
'item1':5,
'item2':2
}
}
Run Code Online (Sandbox Code Playgroud)
项目字典中的项目将具有项目的不同键和计数作为值.
我已经尝试将item字段设置为field.Raw()并且它工作正常,但它没有显示在swagger文档中.
请注意,我不想返回我正在使用的字典列表.
谢谢
我知道并喜欢flask-limiter旧项目。现在我想在我flask-restplus的项目中使用它。
我的最终解决方案将使我能够在每个方法级别上进行速率限制。因此,不同的费率适用于帖子而不是 get 方法。但是,如果我可以定义每个资源(甚至每个命名空间)级别的限制,我已经很高兴了。重要的是每个资源都需要自己的速率限制。
我的第一次尝试是使用@limiter.limit("1 per Minute"). 但这完全被忽略了。
接下来尝试在名称空间本身上使用它:
ns = api.namespace('something',
description='Operations related to maps and positions on a map',
decorators = [limiter.limit("1 Per Minute")]
)
Run Code Online (Sandbox Code Playgroud)
好吧,也不起作用。但
ns = api.namespace('something',
description='Operations related to maps and positions on a map',
decorators = [limiter.limit]
)
Run Code Online (Sandbox Code Playgroud)
做这件事。但是留下一个问题:我只能为每个应用定义一个限制器。所以我只能对我的所有命名空间应用一个限制规则。
关于如何flask-restplus接受传递给限制器装饰器的参数的任何想法?
或者有没有更好的方法来管理我没有看到的flask-resplus中的速率限制?
如何使用 Flask-RestPlus 实现 API 端点来下载 Excel 文件?
以前我使用 Pyramid 实现了类似的功能。然而,这种方法在这里不起作用。这是旧的代码片段:
workBook = openpyxl.Workbook()
fileName = 'Report.xls'
response = Response(content_type='application/vnd.ms-excel',
content_disposition='attachment; filename=%s' % fileName)
workBook.save(response)
return response
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助。
我的根文件夹中的main.py文件如下所示.
app = Flask(__name__)
def configure_app(app):
app.config['SERVER_NAME'] = settings.FLASK_SERVER_NAME
app.config['SWAGGER_UI_DOC_EXPANSION'] = settings.RESTPLUS_SWAGGER_UI_DOC_EXPANSION
app.config['RESTPLUS_VALIDATE'] = settings.RESTPLUS_VALIDATE
app.config['RESTPLUS_MASK_SWAGGER'] = settings.RESTPLUS_MASK_SWAGGER
app.config['ERROR_404_HELP'] = settings.RESTPLUS_ERROR_404_HELP
def initialize_app(app):
configure_app(app)
blueprint = Blueprint('api', __name__, url_prefix='/api')
api.init_app(blueprint)
api.namespaces.pop(0) #this is to remove default namespace from swagger doc
api.add_namespace(user_namespace)
app.register_blueprint(blueprint)
def main():
initialize_app(app)
app.run(debug=settings.FLASK_DEBUG)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
我的app.yaml文件如下所示.
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3
manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
Run Code Online (Sandbox Code Playgroud)
以下是requirements.txt …
我正在使用 Flask 和 Flask-Restplus 构建一个非常复杂的微服务。
它将有许多端点,因此我将每个端点组织成一个单独的蓝图。
下面的示例代码和目录结构应该会给你一个我的想法的提示:
.
??? endpoints
? ??? endpointa.py
? ??? endpointb.py
? ??? endpointc.py
? ??? __init__.py
??? __init__.py
??? run.py
Run Code Online (Sandbox Code Playgroud)
我的主要init .py 看起来像这样:
from flask import Flask, Blueprint, logging, jsonify, request, Response
from flask_restplus import Resource, Api
# create app and api
app = Flask(__name__)
api_prefix = '/api/v1/'
# register Blueprints
from endpoints.endpointa import endpointa_api
app.register_blueprint(endpointa_api, url_prefix=api_prefix)
from …Run Code Online (Sandbox Code Playgroud) 考虑以下:
from flask import Flask
from flask_restplus import Api, Resource, fields
app = Flask(__name__)
api = Api(app)
ns = api.namespace('ns')
payload = api.model('Payload', {
'a_str': fields.String(required=True),
'a_date': fields.Date(required=True)
})
@ns.route('/')
class AResource(Resource):
@ns.expect(payload)
def post(self):
pass
Run Code Online (Sandbox Code Playgroud)
如果我发布,{"a_str": 0, "a_date": "2000-01-01"}我会按预期得到 400,因为a_str不是字符串。但是,当我 POST 时,我{"a_str": "str", "a_date": "asd"}没有得到 400。在这里我也想得到 400,因为“asd”不是常见的日期格式。
我查看了Date类文档,发现有format一个parse方法可以检查字符串是否采用通用日期格式。但是,这里似乎没有调用它们。
有没有另一种方法可以做到这一点?目前我正在手动验证日期格式,但似乎 fask restplus 应该能够为我完成。
我希望能够发布一组文件。action="append"我让它可以使用单个文件,但在添加到解析器时它不起作用。添加时action,swagger UI 允许我上传多个文件,但在打印files变量时None,即使我选择了多个文件也是如此。如何使用 Flask-RESTPlus POST 一组文件?
from flask_restplus import Namespace, Resource, reqparse
from werkzeug.datastructures import FileStorage
file_upload = Namespace(name="files")
upload_parser = reqparse.RequestParser(bundle_errors=True)
upload_parser.add_argument(
name="files",
type=FileStorage,
location="files",
action="append" # If this is removed it works with 1 file
)
@files_upload.route("/")
class Files(Resource):
@files_upload.expect(upload_parser)
def post(self):
args = upload_parser.parser_args()
files = args["files"]
do_something(files)
return ""
Run Code Online (Sandbox Code Playgroud) 剧透警报:我发布了我的解决方案作为此问题的答案
我正在使用flastk-resptlus创建 API。我必须提供特定结构的数据,但我无法获取该数据,请参阅下面的示例:
我需要得到的是这个结构:
{
"metadata": {
"files": []
},
"result" : {
"data": [
{
"user_id": 1,
"user_name": "user_1",
"user_role": "editor"
},
{
"user_id": 2
"user_name": "user_2",
"user_role": "editor"
},
{
"user_id": 3,
"user_name": "user_3",
"user_role": "curator"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
"result" : { "data": []}但问题来了,如果不让“数据”本身成为模型,我就无法获得结构。
到目前为止我尝试做的事情(但没有成功)
# define metadata model
metadata_model = api.model('MetadataModel', {
"files": fields.List(fields.String(required=False, description='')),
}
# define user model
user_model = api.model('UserModel', {
"user_id": fields.Integer(required=True, description=''),
"user_name": fields.String(required=True, description=''),
"user_role": fields.String(required=False, description='') …Run Code Online (Sandbox Code Playgroud) flask-restplus ×10
python ×8
flask ×6
download ×1
file-upload ×1
marshalling ×1
model ×1
payload ×1
post ×1
swagger ×1