Глобальная переменная в Flask сбрасывается на None - PullRequest
1 голос
/ 10 июля 2020

Я создаю приложение Flask, которому требуется доступ к инициализированному классу через запросы. В приведенном ниже запросе POST к серверу Flask говорится, что глобальная переменная ex имеет тип None, несмотря на то, что она инициализирована и переназначена классу Engine в main при запуске. Почему это?

ex = None #Storing the executable so that it can be accessed

flask_app = Flask(__name__)
flask_app.debug = True


@flask_app.route('/reach_engine', methods = ['POST'])
def result():
    global ex
    print(ex.txt) #Prints type error, saying that ex is of type None (this is the problem)

class Engine:
    def __init__(self):
        super(Engine, self).__init__()
        self.txt = 'The real Engine'

def startApp():
    global ex
    ex = Engine()

if __name__ == '__main__':

    #Start a thread that will run the main app
    t = threading.Thread(target=startApp)
    t.daemon = True
    t.start()

    # Start the flask app
    print(rd_info + "Intializing Flask application")
    flask_app.run('0.0.0.0', '1000', debug=True,
        threaded=True, use_reloader=False) 

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Я запустил ваш код после добавления недостающего импорта, установки rd_info и изменения порта на 5000 (поскольку порты ниже 1024 являются привилегированными портами во многих системах)

$ python stackoverflow.py
random-Intializing Flask application
* Serving Flask app "stackoverflow" (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: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

, затем

$ curl --request POST --data '' http://0.0.0.0:5000/reach_engine

вызвало

The real Engine
10.0.2.2 - - [10/Jul/2020 17:31:18] "POST /reach_engine HTTP/1.1" 500 -
Traceback (most recent call last):
...
TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.

плюс выброс отладочной информации Flask / Werkzeug на стороне curl. Я ожидал TypeError, учитывая отсутствие возврата в маршруте. Тем не менее, это доказывает, что поток работает.

Это было в Ubuntu 18.04 с Python 3.6.9.

1 голос
/ 10 июля 2020

Попробуйте использовать @ flask_app.before_first_request, а затем создайте поток. Я оставляю вам эту ссылку, если вы хотите получить более подробную информацию: Глобальная переменная None вместо instance - Python

0 голосов
/ 30 июля 2020

Теперь это решено. В исходном коде было намеренное значение l oop при инициализации движка, из-за чего глобальная переменная ex никогда не была назначена полностью. (Примечание для других, нашедших это)

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