我有一个简单的flask应用程序,如果在配置文件中更改了服务器端口,我想重新启动。 我有以下代码:

#!/usr/bin/env python

from flask import Flask, jsonify
import sys, time, os

app = Flask(__name__,static_url_path='')

HTTPPort = 8080

#------------------------------------------------------------
@app.route("/cmd/<command>")
def command(command):

    if command == "restart":
        Reload()
    return jsonify("OK")

#------------------------------------------------------------
def Reload():
    # reload python script
    os.execl(sys.executable, 'python', __file__, *sys.argv[1:])

#------------------------------------------------------------
if __name__ == "__main__":

    # load options from file, which change HTTPPort value
    # LoadConfig()
    while True:
        try:
            app.run(host="0.0.0.0", port=HTTPPort)
        except Exception as e1:
            print("Error in app.run:" + str(e1))
            time.sleep(2)
            Reload()

问题是,当调用os.execl时,它将重新加载python脚本,但app.run失败,并显示“ [Errno 98]地址已在使用中”

加载应用程序后,您可以通过在浏览器的地址窗口中输入8080 / cmd / restart来触发浏览器中的命令例程。 这将导致flask应用程序接受“重新启动”命令,这将导致调用os.exec()。 此时,该应用将终止并重新加载。 在重新加载app.run()时,会通过异常将错误提示“地址已在使用中”,并且它将尝试每2秒重新加载一次,每次都发生相同的错误。

我尝试在app.run参数列表中设置reload = True,但是这不允许更改端口。 这是否有可能实现,或者我做错了什么?

谢谢

#1楼 票数:1

经过实验后,答案完全不同。 我认为您可能必须执行一个分为两部分的过程。

首先保存所需的端口号,几秒钟后更新文件上的时间戳,以便内置的重新加载程序为您重新启动应用程序。

结合使用重定向到您的新地址,操作几乎是无缝的。 这不会检查端口号是否正在使用中,因此如果选择现有端口,则可能会死掉,但是否则代码很简单。

#!/usr/bin/env python

from flask import Flask, redirect
import os
import configparser

config = configparser.ConfigParser()
config.read('portnumber.ini')

app = Flask(__name__,static_url_path='')

HTTPPort = config['MAIN'].getint('portnumber')


def touchMe():
    with open(__file__, 'a'):
        print(" - setting timestamp of " + __file__ )
        os.utime(__file__, None)


@app.route("/newport/<newport>")
def changeRoute(newport):
    HTTPPort = newport
    name = newport
    config['MAIN']['portnumber'] = newport
    with open('portnumber.ini', 'w') as configfile:
        config.write(configfile)
    touchMe()
    newurl = "http://localhost:" + HTTPPort + "/"
    print("Redirecting to " + newurl)

    return redirect(newurl, code=302)


#------------------------------------------------------------
if __name__ == "__main__":

    # load options from file, which change HTTPPort value
    # LoadConfig()
    while True:
        app.run(host="0.0.0.0", port=HTTPPort, debug=True, use_reloader=True)

  ask by jgyates translate from so

未解决问题?本站智能推荐:

2回复

os.execl *不启动与os.system相同的烧瓶

我正在尝试将烧瓶服务器作为测试套件的一部分启动。 Flask运行(我们找到了/ usr / local / bin / flask),但是在下面给了我标准用法错误,但是没有说出什么问题。 如果将os.execl替换为os.system("/usr/local/bin/flask r
1回复

在 Python Flask/Django 应用程序中热重载属性

大师、奇才、极客 我的任务是提供 Python Flask 应用程序(更一般地说,是用 python 编写的 webapps )一种即时重新加载属性的方法。 具体来说,我和我的团队目前使用{env}.properties文件部署 python 应用程序,该文件包含键值格式(例如 yaml)的各种环
11回复

代码更改时自动重新加载 python Flask 应用程序

我正在研究如何使用 Python 开发一个不错的 Web 应用程序。 由于我不希望一些高阶结构妨碍我,我的选择落在了轻量级Flask 框架上。 时间会证明这是否是正确的选择。 所以,现在我已经使用 mod_wsgi 设置了一个 Apache 服务器,并且我的测试站点运行良好。 但是,我想通过使站点
1回复

用os.execl替换正在运行的python脚本

我可能看起来不够努力,但我试图用另一个python脚本替换正在运行的python脚本。 根据我所做的研究,使用os.execl函数可能是我正在寻找的。 我对应该与函数一起使用的参数有点困惑。 任何人都可以帮我解释如何将当前运行的python脚本替换为另一个。
1回复

Gunicorn 不重新加载烧瓶应用程序的表单提交

我是烧瓶和枪炮的新手。 我正在使用 gunicorn 进行产品托管。 我有一个提交按钮,用于将表单数据存储在数据库中; 我希望新存储的数据从数据库中选取并在页面重新加载时显示。 我观察到的是,Gunicorn 在重新启动之前不会重新加载任何内容。 谁能帮我在不停止服务器的情况下重新加载数据?
1回复

网站上的Python Flask设置文本而无需重新加载

我创建了一个简单的flask应用程序。 我不会在这里显示它,因为其中包含很多Bootstrap内容。 我的网站外观如下: 安装第一个扩展程序后: 等等... 但是网站上也有引导程序。 因此,加载页面需要花费一些时间。 但是我只想设置状态标签。 我该怎么做而不刷
1回复

Flask Python多次重载对象

我有一个flask应用程序,该应用程序获取一个json文件并将其加载到内存中,然后将数据显示给最终用户。 每当我点击刷新或浏览网站时,提取数据就会再次发生。 因此,将n重新加载到列表中。 例如,如果有5个服务,那么下一次重新加载将有10个服务,下一次重新加载将有15个服务,依此类推。如何在
3回复

使用os.execl()重新加载时没有名为'x'的模块

我有一个python脚本使用以下重新启动: 大部分时间这种方法工作正常,但偶尔重启失败,没有名为error的模块。 例子: 编辑:我按照andr0x的建议尝试了gc.collect(),但这没有用。 我得到了同样的错误: 编辑2:我尝试了sys.stdout.fl