Python 在Flask应用程序旁边运行代码

Python 在Flask应用程序旁边运行代码,python,flask,Python,Flask,我已经为我的python应用程序编写了一个web界面。当运行export FLASK\u APP=main.py然后运行FLASK run时,此功能运行良好。现在我希望实际的应用程序也能运行,这样接口就可以很有用了 下面的代码是我的main.py,在这里我调用flask应用程序工厂函数 from webinterface import create_app if __name__ == '__main__': create_app() while(True):

我已经为我的python应用程序编写了一个web界面。当运行
export FLASK\u APP=main.py
然后运行
FLASK run
时,此功能运行良好。现在我希望实际的应用程序也能运行,这样接口就可以很有用了

下面的代码是我的main.py,在这里我调用flask应用程序工厂函数

from webinterface import create_app

if __name__ == '__main__':
    create_app()
    while(True):
        # Some code logging different things
我想在无限循环中做一些事情,但是当我尝试运行应用程序时,它要么只运行web界面,要么运行infinte循环,这取决于我是使用
flask run
还是
python main.py
启动它


如何最好地实现这一点?

在前台应用程序的线程中运行Flask是可能的,有时也是方便的。这是一个诡计,一个大陷阱和一个约束

约束条件是,这是您希望在“安全”环境中执行的操作(例如,在笔记本电脑上为本地浏览器或家庭内部网提供服务器),因为这涉及到运行开发服务器,而这是您不希望在敌对环境中执行的操作。您也不能使用自动页面重新加载(但可以启用调试)

陷阱在于,如果UI与前台应用程序共享任何非平凡状态(包括DICT),则需要使用共享的
threading.Lock()
来保护访问,以便一次只有一个线程在读取或写入数据

诀窍是在创建应用程序后但在启动应用程序之前,将对共享状态的引用插入到应用程序的配置中,方法如下:

def webserver(state):
    app.config['STATE'] = state
    # If running on, say, a Raspberry Pi, use 0.0.0.0 so that
    # you can connect to the web server from your intranet.
    app.run(host='0.0.0.0', use_reloader=False, debug=True)

def main():
    state = SharedState()
    web_thread = threading.Thread(target=webserver, args=(state,))
    web_thread.start()

    state.set('counter' 0)
    while True:
        # Do whatever you want in the foreground thread
        state.set('counter', state.get('counter') + 1)

class SharedState():
    def __init__(self):
        self.lock = threading.Lock()
        self.state = dict()

    def get(self, key):
        with self.lock:
            return self.state.get(key)

    def set(self, key, value):
        with self.lock:
            self.state[key] = value
然后,从Flask视图函数中执行以下操作

@app.route('/')
def home():
    state = app.config['STATE']
    counter = state.get(counter)
    return render_template("index.html", counter=counter)

为什么您需要这个
,而
正好循环?如果是关于日志记录的,您可以使用
logging
module@PRMoureu它用于从外部组件进行日志记录。温度传感器等,并将其记录到数据库中,它需要永久运行。WSGI应用程序不是为并行运行其他任务而设计的。它可能与开发服务器一起工作,但在生产设置中,您将遇到麻烦。因此,为了完成任务,您是否建议必须分离运行的python脚本?一个处理web界面,一个处理所有日志和测量任务?是的,听起来好多了。