社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Matt • 5 年前 • 1858 次点击  

我在用 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
 
1858 次点击  
文章 [ 6 ]  |  最新文章 5 年前
salsa_man
Reply   •   1 楼
salsa_man    5 年前

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

As stated here

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

trojek
Reply   •   2 楼
trojek    5 年前

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

L A
Reply   •   3 楼
L A    6 年前

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

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

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

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

davidism
Reply   •   5 楼
davidism    7 年前

如果你用的是现代的 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    7 年前

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 处理程序 可以