如何在Flask代码中配置默认启动参数,仅通过flask run命令启动服务
问题根因
你遇到的Ctrl+C关闭后重复启动默认服务的问题,是错误将服务启动逻辑写到了Flask应用工厂函数create_app内部导致的:
- 执行
flask run命令时,Flask CLI工具会先调用create_app函数获取应用实例 - 你在
create_app内部先调用了serving.run_simple启动自定义配置的服务,此时进程会阻塞在这一行 - 按下Ctrl+C终止这个服务后,
create_app才会继续执行return语句,将app实例返回给Flask CLI - Flask CLI拿到返回的app后,会按默认配置再启动一次服务,就是你看到的无自定义配置的默认服务
解决方案
推荐你使用符合Flask官方规范的配置方案,完全不用修改现有业务代码,所有用户直接执行flask run即可自动加载配置:
- 首先将
create_app函数里最后一行的serving.run_simple(...)代码删掉,恢复正常的应用工厂逻辑 - 在项目根目录新建名为
.flaskenv的文件,写入以下内容:
FLASK_APP=你的应用入口模块名(比如flaskr) FLASK_RUN_HOST=0.0.0.0 FLASK_RUN_PORT=443 FLASK_RUN_CERT=adhoc
- 将
python-dotenv依赖添加到你的requirements.txt中,用户安装依赖后,执行flask run就会自动读取上述配置,不需要加任何额外参数
如果你坚持要通过代码直接启动服务,可以改用以下方式,不使用flask run命令启动:
- 删掉
create_app中的serving.run_simple(...)代码 - 在应用入口文件的末尾添加如下代码:
if __name__ == '__main__': from werkzeug import serving app = create_app() serving.run_simple("0.0.0.0", 443, app, ssl_context='adhoc')
- 用户直接执行
python 你的入口文件名.py即可启动服务
注意事项
443属于系统特权端口,Linux/macOS环境下普通用户直接启动会报权限错误,需要加sudo前缀执行启动命令,或者将端口改为1024以上的非特权端口(比如8443)。
内容的提问来源于stack exchange,提问作者aujau
相关产品推荐
相关产品推荐

