Запустите Flask по требованию для визуализации вычисленных данных - PullRequest
0 голосов
/ 28 февраля 2020

Используя Python 3.7, я создал утилиту CLI, которая выводит некоторые результаты на стандартный вывод. В зависимости от варианта результаты должны быть визуализированы в браузере (для одного пользователя, без сеансов). Flask кажется хорошим выбором для этого. Тем не менее, это не стандартный сценарий использования, описанный в документах или руководствах.

Я ищу наилучший способ передачи данных (например, Python Список) в приложение Flask, чтобы я мог вернуть его из функций просмотра. В основном это были бы неизменные данные приложения. Кажется, работает следующее, но я не люблю использовать глобальные переменные:

main.py:

import myapp

result = compute_stuff()
if show_in_browser:
  myapp.data = result
  myapp.app.run()

myapp.py:

from flask import Flask
from typing import List

app = Flask(__name__)
result: List

@app.route("/")
def home():
  return f"items: {len(result)}"

Чтение Flask документов У меня сложилось впечатление, что я должен использовать контекст приложения. С другой стороны, его время жизни не распространяется на запросы, и я не знаю, как его заполнить. Читая другие вопросы, я мог бы использовать объект конфигурации Flask, потому что он, кажется, доступен при каждом запросе. Но это не совсем о конфигурации. Или, может быть, я должен использовать Klein , вдохновленный этим ответом?

1 Ответ

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

Кажется, нет лучшего способа практики. Итак, я собираюсь изменить мой первоначальный подход:

class MyData:
    pass

class MyApp(Flask):
    def __init__(self) -> None:
        super().__init__(__name__)
        self.env = "development"
        self.debug = True

    def getData(self) -> MyData:
        return self._my_data

    def setMyData(self, my_data: MyData) -> None:
        self._my_data = my_data

app = MyApp()

Таким образом, я могу установить данные после того, как экземпляр app уже был создан - что необходимо для его использования в декораторах маршрутизации. определяется за пределами класса. Было бы неплохо иметь больше инкапсуляции: использовать методы app для маршрутизации (с декораторами) вместо глобальных функций модуля, обращающихся к глобальному объекту app модуля. Видимо это не колбы c.

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