Запустить flask как атрибут экземпляра с декораторами маршрута? - PullRequest
0 голосов
/ 02 марта 2020

Я надеюсь иметь класс, который подклассов threading.thread и отвечает за запуск flask. Класс должен также инкапсулировать декоратор

flask.

Декоратор route предоставляется экземпляром объекта Flask. Я надеюсь содержать все Flask, относящиеся к классу.

*1007* Это приводит к проблеме, где получить декоратор, я должен получить доступ к Flask в качестве атрибута экземпляра. Но @self недоступен как декоратор.

Я знаю, что это можно преодолеть, сделав Flask глобальным для модуля et c. Есть ли способ сохранить его внутри класса и все еще достичь этого?

import threading
from flask import Flask


class ControllableServer(threading.Thread):

    def __init__(self):
        self._flask = Flask(__name__)

    # This needs to be a decorator from an initialised flask object
    # In the examles they usually do:
    #    app = Flask(__name__)
    #    @app.route(("/endpoint", methods=['GET', 'POST'])
    #    def endpoint():
    #        ....
    @self._flask.route("/endpoint", methods=['GET', 'POST'])
    def _endpoint(self):
        return str("Endpoint")

    def run(self):
        self._flask.run()


if __name__ == "__main__":
    controllable_server = ControllableServer()
    controllable_server.start()

Ошибка:

   @self._flask.route("/endpoint", methods=['GET', 'POST']
   All│NameError: name 'self' is not defined

1 Ответ

0 голосов
/ 03 марта 2020

Эту проблему можно решить, используя add_url_rule вместо декоратора.

from flask import Flask, Response
import threading
import requests
import logging

logging.basicConfig(format='[Thread: %(threadName)s-%(thread)d] %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)


class ControllableServer(threading.Thread):

    class _URLCallbackClass():
        def url_callback(self):
            return Response("Hello from url callback", 200)

    def __init__(self):
        super().__init__(daemon=True)
        self._flask = Flask(__name__)

    def run(self):
        callback_class = ControllableServer._URLCallbackClass()
        self._flask.add_url_rule('/endpoint', 'url_callback', callback_class.url_callback)
        logger.info("Starting flask")
        self._flask.run()


if __name__ == "__main__":                                                                                                                                                                                         
    controllable_server = ControllableServer()                                                                                                                                                                     
    controllable_server.start()                                                                                                                                                                                    
    logger.info("Flask is started")                                                                                                                                                                                
    response = requests.get("http://127.0.0.1:5000/endpoint")                                                                                                                                                      
    logger.info(f"Got response: {response.text}")                                                                                                                                                                  

Результат:

[Thread: Thread-1-139887742854912] Starting flask
 * Serving Flask app "basic_flask" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
[Thread: MainThread-139887779895104] Flask is started
[Thread: Thread-1-139887742854912]  * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
[Thread: Thread-2-139887733913344] 127.0.0.1 - - [03/Mar/2020 18:00:54] "GET /endpoint HTTP/1.1" 200 -
[Thread: MainThread-139887779895104] Got response: Hello from url callback

Обратите внимание

Поскольку регистратор rool был настроен на запись имен потоков, теперь мы видим также имена потоков, которые flask создает внутри. Это [Thread: Thread-2-139887733913344]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...