Как обрабатывать несколько конечных точек GET в классе ответов Flask-Restplus

Я только начинаю изучать Flask и пытаюсь создать простой API, работающий с серверной частью обработки данных (называется ATEExplorer).

Я начал с создания пространства имен «backend», то есть 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.')

Мне нужны две конечные точки, версия, возвращающие версию серверной части, например. 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()}

Кажется, фляга позволяет нескольким классам с одним и тем же именем делать разные вещи на основе декоратора «маршрут», то есть имя класса не имеет значения.

Есть ли «учебник» способ выразить вышеприведенную логику?


person Totte Karlsson    schedule 04.06.2019    source источник
comment
Я бы не стал использовать одно и то же имя класса. Это гораздо менее читабельно, и кажется, что два класса каким-то образом связаны (логически).   -  person AdamGold    schedule 06.06.2019
comment
Ну, меня беспокоит структура, которая позволяет писать и выполнять такой код, в первую очередь... звучит так, как будто вышеизложенное лучше выражается с использованием чего-то вроде анонимной структуры, часто используемой в C/C++. Было бы полезно увидеть случай, когда имя класса действительно имеет значение.   -  person Totte Karlsson    schedule 06.06.2019
comment
Я не flask-restplus сообразителен, но я уверен, что имя класса имеет значение для удобочитаемости, не более того.   -  person AdamGold    schedule 06.06.2019
comment
Это также мешает предоставленному пользовательскому интерфейсу (т. Е. При нажатии на маршрут, который содержит одно и то же имя класса, он прокручивается до первого)   -  person AugBar    schedule 03.11.2020


Ответы (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"})
person AdamGold    schedule 05.06.2019
comment
Спасибо @AdamGold, в итоге я использовал ваш подход. Похоже, что много накладных расходов, к сожалению. - person Totte Karlsson; 05.06.2019