Python Dash应用Azure部署多环境.env配置及本地运行问题求助
问题解决与环境配置建议
一、本地运行环境变量读取修复
当前env.py仅加载.env文件,未读取.env.development,导致ENVIRONMENT变量为空。修改代码,按优先级加载配置文件:基础.env先加载,再加载对应环境的配置文件(开发环境加载.env.development),环境文件会覆盖基础文件的同名变量。
修改后的env.py代码:
from dotenv import load_dotenv import os # 先加载基础.env文件 load_dotenv() # 再加载开发环境配置,开发配置覆盖基础配置 load_dotenv('.env.development', override=True) environment = os.getenv('ENVIRONMENT') print("ENV: ", environment)
如果需要支持动态环境切换,可通过系统变量指定环境:
from dotenv import load_dotenv import os # 优先加载基础.env load_dotenv() # 从系统变量获取环境标识,默认dev target_env = os.getenv('TARGET_ENV', 'dev') # 加载对应环境的配置文件 env_file = f'.env.{target_env}' if os.path.exists(env_file): load_dotenv(env_file, override=True) environment = os.getenv('ENVIRONMENT') print("ENV: ", environment)
二、Azure DevOps CI/CD环境配置(DEV/PROD区分)
方案1:部署阶段替换.env文件
在Dev和Prod部署步骤中,将对应环境的配置文件重命名为.env,确保应用加载正确配置。修改build&deploy.yml的部署阶段:
Dev环境部署步骤修改
- stage: DeployDev displayName: 'Deploy to Dev' dependsOn: ArchiveArtifact jobs: - deployment: DevDeploy pool: 'dev-agent-pool' environment: 'dev' strategy: runOnce: deploy: steps: - task: ExtractFiles@1 inputs: archiveFilePatterns: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip' destinationFolder: '$(Pipeline.Workspace)/temp-dev' cleanDestinationFolder: true - script: | cd $(Pipeline.Workspace)/temp-dev cp .env.development .env displayName: 'Replace .env with dev config' - task: ArchiveFiles@2 inputs: rootFolderOrFile: '$(Pipeline.Workspace)/temp-dev' includeRootFolder: false archiveType: 'zip' archiveFile: '$(Pipeline.Workspace)/temp-dev/$(Build.BuildId)-dev.zip' replaceExistingArchive: true - task: AzureWebApp@1 inputs: azureSubscription: 'subscription' appType: 'webAppLinux' appName: 'web-app-dev-name' package: '$(Pipeline.Workspace)/temp-dev/$(Build.BuildId)-dev.zip' deploymentMethod: 'auto'
Prod环境部署步骤修改
- stage: DeployProd displayName: 'Deploy to Prod' dependsOn: DeployDev condition: and(succeeded(), or(eq(variables['Build.SourceBranch'], 'refs/heads/main') , eq(variables['Build.SourceBranch'], 'refs/heads/release/*'))) jobs: - deployment: ProdDeploy pool: 'agent-pool' environment: 'prod' strategy: runOnce: deploy: steps: - task: ExtractFiles@1 inputs: archiveFilePatterns: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip' destinationFolder: '$(Pipeline.Workspace)/temp-prod' cleanDestinationFolder: true - script: | cd $(Pipeline.Workspace)/temp-prod cp .env.production .env displayName: 'Replace .env with prod config' - task: ArchiveFiles@2 inputs: rootFolderOrFile: '$(Pipeline.Workspace)/temp-prod' includeRootFolder: false archiveType: 'zip' archiveFile: '$(Pipeline.Workspace)/temp-prod/$(Build.BuildId)-prod.zip' replaceExistingArchive: true - task: AzureWebApp@1 inputs: azureSubscription: 'prod_subscription' appType: 'webAppLinux' appName: 'web-app-prod-name' package: '$(Pipeline.Workspace)/temp-prod/$(Build.BuildId)-prod.zip' deploymentMethod: 'auto'
方案2:Azure App Service直接设置环境变量(更安全)
不打包.env文件到部署包,直接在Azure Portal为Dev/Prod环境设置应用变量:
- 进入对应App Service的「配置」→「应用程序设置」
- Dev环境添加
ENVIRONMENT=dev、REACT_VERSION=18.2.0 - Prod环境添加
ENVIRONMENT=prod、REACT_VERSION=18.2.0
修改env.py,系统环境变量会自动覆盖.env文件的配置:
from dotenv import load_dotenv import os # 本地开发加载.env,线上环境优先读取系统变量 load_dotenv() environment = os.getenv('ENVIRONMENT') print("ENV: ", environment)
此方式无需修改部署流程,且敏感配置不会随代码包泄露。
三、Python Web应用环境处理技巧
- 配置优先级:系统环境变量 > 环境专属配置文件 > 基础配置文件,确保生产环境配置不被本地文件覆盖。
- 敏感信息隔离:将包含密钥、密码的.env文件加入
.gitignore,仅提交.env.example作为模板,本地开发时复制后填写真实值。 - 环境自动识别:通过CI/CD变量、命令行参数自动切换环境,比如本地默认dev,Pipeline中根据部署阶段设置
TARGET_ENV变量。 - 配置验证:应用启动时打印非敏感的配置摘要,确认环境加载正确。
- 分层配置:将通用配置放在
.env,环境专属配置放在.env.dev/.env.prod,敏感配置通过云服务环境变量设置,便于维护。
内容的提问来源于stack exchange,提问作者Jason Susanto
相关产品推荐
相关产品推荐

