如何在Flask-Restplus响应类中处理多个“ GET”端点

时间:2019-06-04 23:15:47

标签: python flask flask-restplus

我刚刚开始学习Flask,并且正在尝试创建一个简单的API,用于处理数据处理后端(名为ATExplorer)。

我首先创建了一个“后端”命名空间,即backendAPI:

from flask import Flask, Blueprint, redirect, url_for
from flask_restplus import Resource, Api
from werkzeug.routing import Rule

app = Flask(__name__)
app.config.SWAGGER_UI_DOC_EXPANSION = 'list'
blueprint = Blueprint('api', __name__, url_prefix='/api')
api = Api(blueprint, version=0.1, title='AT Pipeline API', doc='/swagger/')
app.register_blueprint(blueprint)
backendAPI = api.namespace('backend', description='Manage ATExplorer backend API.')

我想要两个端点 version ,以返回后端的版本,例如0.1和 status ,返回后端的状态,例如“已停止”或“正在运行”

我创建了一个响应类和如下路由:

@backendAPI.route('/version', methods=['GET'])
@backendAPI.route('/status',  methods=['GET'])

class Backend(Resource):

     def get(self):
        #How to differentiate between the ../backend/version call and a 
        # ../backend/status call here??
        #if call is for status:
        #     return {'status': 'running'}
        #elif call is for version
        #     return {'version': '0.1'}

猜猜这是设计问题。在这种情况下,哪种“设计”更可取?

----编辑----- 可以重写以上代码,并通过以下方式获得所需的最终(客户端)结果:

class Backend(Resource):
    def __init__(self, api=None, *args, **kwargs):
         #The 'actual' backend resource
         self.backend = atp.backend

@backend_api.route('/status',  methods=['GET'])
class Dummy(Backend):
     def get(self):
         return {'status':self.backend.getStatus()}

@backend_api.route('/version',  methods=['GET'])
class Dummy(Backend):
     def get(self):
         return {'status':self.backend.getVersion()}

似乎flask允许具有相同名称的多个类,基于“ route”修饰符做不同的事情,即,类名称为不相关

是否存在一种“教科书”方式来表达上述逻辑?

1 个答案:

答案 0 :(得分:1)

我相信这更多是一个flask_restplus问题,因为在Flask中,您通常将方法用作路由。

无论如何,您是否考虑过将两个不同的类用于两个不同的动作?

@backendAPI.route('/version', methods=['GET'])
class Version(Resource):
    def get(self):
         return flask.jsonify({"version_number": "0.1"})

@backendAPI.route('/status', methods=['GET'])
class Status(Resource):
    def get(self):
         return flask.jsonify({"status": "running"})