Приложение Flask для доступа к маршрутам, определенным в классе

Я новичок в Python, у меня есть класс, и на нем определены два маршрута. Как мне привязать эти маршруты к основному работающему серверу.

Вот мой restinput.py

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import logging

from rasa_core.channels import HttpInputChannel
from rasa_core import utils
from rasa_core.agent import Agent
from rasa_core.interpreter import RasaNLUInterpreter
from rasa_core.channels.channel import UserMessage
from rasa_core.channels.direct import CollectingOutputChannel

from flask import Blueprint, request, jsonify

logger = logging.getLogger(__name__)

class RestInput(InputChannel):

    @classmethod
    def name(cls):
        return "rest"

    @staticmethod
    def on_message_wrapper(on_new_message, text, queue, sender_id):
        collector = QueueOutputChannel(queue)

        message = UserMessage(text, collector, sender_id,
                              input_channel=RestInput.name())
        on_new_message(message)

        queue.put("DONE")

    def _extract_sender(self, req):
        return req.json.get("sender", None)


    def _extract_message(self, req):
        return req.json.get("message", None)

    def stream_response(self, on_new_message, text, sender_id):
        from multiprocessing import Queue

        q = Queue()

        t = Thread(target=self.on_message_wrapper,
                   args=(on_new_message, text, q, sender_id))
        t.start()
        while True:
            response = q.get()
            if response == "DONE":
                break
            else:
                yield json.dumps(response) + "\n"

    def blueprint(self, on_new_message):
        custom_webhook = Blueprint(
                'custom_webhook_{}'.format(type(self).__name__),
                inspect.getmodule(self).__name__)

        @custom_webhook.route("/", methods=['GET'])
        def health():
            return jsonify({"status": "ok"})

        @custom_webhook.route("/webhook", methods=['POST'])
        def receive():
            sender_id = self._extract_sender(request)
            text = self._extract_message(request)
            should_use_stream = utils.bool_arg("stream", default=False)

            if should_use_stream:
                return Response(
                        self.stream_response(on_new_message, text, sender_id),
                        content_type='text/event-stream')
            else:
                collector = CollectingOutputChannel()
                on_new_message(UserMessage(text, collector, sender_id,
                                           input_channel=self.name()))
                return jsonify(collector.messages)

        return custom_webhook
def run(serve_forever=True):
    interpreter = RasaNLUInterpreter("models/nlu/default/current")
    action_endpoint = EndpointConfig(url="http://localhost:5055/webhook")
    agent = Agent.load("models/dialogue", interpreter=interpreter,action_endpoint=action_endpoint)
    input_channel = RestInput()
    if serve_forever:
        agent.handle_channels([InputChannel(5004, "/chat", input_channel)])
    return agent

Это мой app.py

from flask import Flask
from flask_cors import CORS
from restinput import RestInput
app = Flask(__name__)
CORS(app)

@app.route("/")
def index():
    return "Hello"

@app.route("/parse",methods=['POST'])
def chat():
    #some code to access the class on this route


if __name__ == "__main__":
    app.run(host='0.0.0.0')

Что я должен добавить в маршрут "/parse", чтобы иметь возможность доступа к маршрутам из класса RestInput.

Я попытался создать агента в / parse-маршруте, а затем получить доступ к другим маршрутам, таким как / parse / webhook, но он не работает. Я просмотрел проект колбы и просмотр, но я не могу понять это.

1 ответ

Маршруты в RestInput прикреплены к Blueprint. Чтобы прикрепить эти маршруты к вашему основному приложению, вы должны зарегистрировать план:

# app.py
some_function = ...  # whatever you want
app.register_blueprint(RestInput().blueprint(some_function))
Другие вопросы по тегам