Py学习  »  Python

使用Python、Flask和SQLAlchemy获取Postgresql数据库中的双条目

Matt • 4 年前 • 905 次点击  

我在用 Flask

#!/usr/bin/env python
from datetime import datetime
from app import app
import config

if __name__ == '__main__':
    print '################### Restarting @', datetime.utcnow(), '###################'
    app.run(port=4004, debug=config.DEBUG, host='0.0.0.0')

当我启动服务器,或由于文件已更新而自动重新启动时,它总是显示打印行两次:

################### Restarting @ 2014-08-26 10:51:49.167062 ###################
################### Restarting @ 2014-08-26 10:51:49.607096 ###################

虽然这并不是一个真正的问题(其余的工作如预期),但我只是想知道为什么它会这样做?有什么想法吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53095
 
905 次点击  
文章 [ 6 ]  |  最新文章 4 年前
salsa_man
Reply   •   1 楼
salsa_man    4 年前

在Flask 0.11中,建议使用 flask run 而不是 python application.py . 使用后者可能导致代码运行两次。

As stated here

... 从烧瓶0.11开始,推荐使用烧瓶法。原因是由于重载机制的工作方式有一些奇怪的副作用(比如执行某些代码两次…)

trojek
Reply   •   2 楼
trojek    4 年前

WEB_CONCURRENCY 以英雄为背景。要设置为一个,可以在控制台中编写 heroku config:set WEB_CONCURRENCY=1

L A
Reply   •   3 楼
L A    5 年前

我也有同样的问题。我通过修改main并在其中插入use_reloader=False解决了这个问题。如果有人在这里寻找解决此问题的方法,那么下面的代码将使您开始,但是您将自动检测到代码更改的功能,并且重新启动应用程序将不起作用。每次代码编辑后,您都必须手动停止并重新启动应用程序。

if __name__ == '__main__':
app.run(debug=True,use_reloader=False)
Carvell Wakeman
Reply   •   4 楼
Carvell Wakeman    7 年前

我有同样的问题,我通过设置 app.debug False . 设置为 True 导致我 __name__ == "__main__" 两次被叫。

(我本想把这个作为评论发布,但我没有足够的代表作为答案发布,希望它能帮助其他人)

davidism
Reply   •   5 楼
davidism    6 年前

如果你用的是现代的 flask run 命令,没有任何选项 app.run --no-reload :

FLASK_DEBUG=1 flask run --no-reload

也, __name__ == '__main__' 永远不会是真的,因为应用程序不是直接执行的。使用相同的想法 Martijn's answer __main__ 封锁。

if os.environ.get('WERKZEUG_RUN_MAIN') != 'true':
    # do something only once, before the reloader

if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
    # do something each reload
Martijn Pieters
Reply   •   6 楼
Martijn Pieters    6 年前

Werkzeug重载程序生成一个子进程,以便它可以在每次代码更改时重新启动该进程。Werkzeug是一个库,当您调用 app.run() .

restart_with_reloader() function code 再一次 具有 subprocess.call()

如果你设置 use_reloader False

app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)

当使用 flask run 命令也:

FLASK_DEBUG=1 flask run --no-reload

你可以找 WERKZEUG_RUN_MAIN 如果要检测何时处于重新加载子进程中,则为环境变量:

import os
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
    print '################### Restarting @ {} ###################'.format(
        datetime.utcnow())

但是,如果需要设置模块全局变量,则应使用 @app.before_first_request decorator

@app.before_first_request
def before_first_request():
    print '########### Restarted, first request @ {} ############'.format(
        datetime.utcnow())

如果在使用forking或新的子进程来处理请求的完整WSGI服务器中运行此命令,请考虑 before_first_request 处理程序 可以