Azure WebApp部署Flask应用:如何确保先执行get_secrets再启动?
解决Azure WebApp部署Flask时get_secrets未执行的问题
问题原因
Azure WebApp部署Flask应用时,默认通过WSGI服务器(如Gunicorn、IIS)直接加载Flask实例,不会触发if __name__ == "__main__"代码块,导致你原来的start_app()函数(以及内部的get_secrets()调用)完全没机会执行。
解决方案
方案1:将get_secrets移至全局作用域执行
把密钥获取逻辑放在Flask实例初始化后的全局代码中,确保无论本地还是生产环境都会执行:
app = Flask(__name__) def get_secrets(): try: # 示例:从Azure Key Vault或环境变量获取密钥,存入app.config供全局使用 app.config['DB_PASSWORD'] = os.getenv('DB_PASSWORD') app.config['API_KEY'] = os.getenv('API_KEY') # 若使用Azure Key Vault,可在此调用azure-keyvault-secrets的SDK获取密钥 return True except Exception as e: print(f"密钥获取失败: {str(e)}") return False # 全局执行密钥获取,失败则直接终止应用 successful_secret_retrieval = get_secrets() if not successful_secret_retrieval: raise RuntimeError("无法获取必要密钥,应用启动失败") @app.route("/my-endpoint", methods=["POST"]) def endpoint(): # 直接通过app.config使用密钥 db_pwd = app.config['DB_PASSWORD'] # 业务逻辑处理 return "请求处理完成" def start_app(): app.run(host="0.0.0.0", debug=False, port=9090) if __name__ == "__main__": start_app()
方案2:通过WSGI入口文件控制启动流程
如果你的项目使用独立的WSGI入口文件(如wsgi.py),在该文件中先执行密钥获取,再加载Flask实例:
# wsgi.py import os from flask import Flask app = Flask(__name__) def get_secrets(): try: app.config['SECRET_KEY'] = os.getenv('SECRET_KEY') return True except Exception as e: print(f"密钥获取失败: {str(e)}") return False # 先执行密钥获取 successful_secret_retrieval = get_secrets() if not successful_secret_retrieval: raise RuntimeError("密钥获取失败,无法启动应用") # 导入路由(需放在密钥获取之后,确保路由能访问密钥) from your_app_module import routes if __name__ == "__main__": app.run()
注意事项
- 生产环境务必关闭
debug=True,避免安全风险。 - 若使用Azure Key Vault存储密钥,需为WebApp配置系统分配托管标识,并给该标识授予Key Vault的
Secret Reader权限。 - 也可直接将密钥存入WebApp的应用设置(环境变量),通过
os.getenv()读取,这种方式无需额外配置权限。
内容的提问来源于stack exchange,提问作者Archit
相关产品推荐
相关产品推荐

