在 Windows 中为 Flask 应用程序导出环境变量

bub*_*ain 3 python factory environment-variables flask

我正在关注一个 Youtube 教程全功能 Web 应用程序,但我遇到了应用程序工厂的问题。根据我的理解,我需要将SECRET_KEY和SQLALCHEMY_DATABASE_URI等敏感信息放入环境变量中。在视频中,创建者在 Mac 上工作,他打开了他的 .bash_profile 文件并添加了这些行(我将实际值留空):

export SECRET_KEY='....'
export SQLALCHEMY_DATABASE_URI='......'
Run Code Online (Sandbox Code Playgroud)

我正在使用 Windows,但在我的计算机中找不到 .bash_profile 文件,所以我转到控制面板并设置新的环境变量 SECRET_KEY 和 SQLALCHEMY_DATABASE_URI。然后我按照视频中的步骤在 config.py 中创建此类 Config

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI')
    MAIL_SERVER = 'smtp.gmail.com'
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    MAIL_USERNAME = os.environ.get('EMAIL_USER')
    MAIL_PASSWORD = os.environ.get('EMAIL_PASSWORD')

Run Code Online (Sandbox Code Playgroud)

然后我运行了我的应用程序,但是出现了一条错误消息“使用CSRF需要一个秘密密钥。”,所以我认为我的flask应用程序无法获取我设置的SECRET_KEY或其他环境变量。在我的init .py 中有这些配置之前,应用程序运行良好,但现在当我将这些配置移动到 config.py 中的对象内部时,它停止工作。

根据我的理解,export是一个创建环境变量的命令,所以我认为在 .bash_profile 文件中导出这些变量等于设置环境变量。

为了解决我的问题,我尝试按照教程(https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xv-a-better-application-structure)创建 .env 文件。在命令提示符下,我跑了

 pip install python-dotenv
Run Code Online (Sandbox Code Playgroud)

在 Config.py 中,我添加了

from dotenv import load_dotenv

basedir = os.path.abspath(os.path.dirname(__file__))
load_dotenv(os.path.join(basedir, '.env'))
Run Code Online (Sandbox Code Playgroud)

我认为这会创建一个 .env 文件,我可以在其中存储我的环境变量,但它什么也没做,我在我的目录中没有看到任何 .env 文件。有人可以帮帮我吗 ?我有几个问题:

  1. 我需要添加/修复什么才能使我的应用程序正常工作?

  2. 设置环境变量和导出它是一样的吗?如果没有,如何在设置环境变量后导出环境变量以便我的应用程序可以工作?

  3. 在 .env 文件中存储环境变量与在控制面板中设置环境变量有何不同?因为当我尝试在 google 上搜索“在 windows 中编辑 .env 文件”时,出现了“添加环境变量”之类的结果。

  4. .bash_profile 和 .env 文件有什么区别?我跑了man bash,它说 .bash_profile is The personal initialization file, executed for login shells,但我不明白这是否意味着它与 .env 文件完全不同。

abd*_*sco 7

从控制面板设置环境变量的问题在于,要检测这些变量的变化的程序,需要关闭并重新打开。但是,当您运行程序时,它会从其父进程继承环境变量。所以你也需要关闭它,一直持续到explorer.exe. 所以有点棘手。

所以你需要遵循不同的方法。

1. 从命令行设置环境变量:

您可以使用setcmd 上的命令(或$envPowerShell上的全局命令)为命令行会话设置环境变量(exportWindows 上不存在)。

# cmd
set "SECRET_KEY=s3cr3t"

# powershell
$env:SECRET_KEY = 's3cr3t';
Run Code Online (Sandbox Code Playgroud)

然后检查它是否真的设置:

# cmd
echo %SECRET_KEY%

# powershell
$env:SECRET_KEY
Run Code Online (Sandbox Code Playgroud)

应该打印s3cr3t. 或者您可以只使用set不带任何参数的命令,它将打印所有环境变量。

以这种方式设置所有环境变量后,运行您的应用程序:

# cmd
set "SECRET_KEY=s3cr3t"

# powershell
$env:SECRET_KEY = 's3cr3t';
Run Code Online (Sandbox Code Playgroud)
# cmd
echo %SECRET_KEY%

# powershell
$env:SECRET_KEY
Run Code Online (Sandbox Code Playgroud)

运行:

python config.py
Run Code Online (Sandbox Code Playgroud)

输出:

s3cr3t
Run Code Online (Sandbox Code Playgroud)

现在您可以config.py从其他文件中导入。

需要注意的一件事是,一旦您关闭该 cmd 窗口,这些环境值将被取消设置。因此,如果您打开一个新的命令行窗口,则需要重新输入它们。或者您可以从控制面板设置值,然后新的 cmd 窗口将自动继承这些值(类似于.bashrc文件)。

使用.env文件

另一种方法是.env在你项目的根文件夹中创建一个文件,它是一个文本文件,格式如下

SECRET_KEY=s3cr3t
SQLALCHEMY_DATABASE_URI=sqlite:///app.db
Run Code Online (Sandbox Code Playgroud)

文件夹结构:

.
??? .env
??? config.py
??? app.py
Run Code Online (Sandbox Code Playgroud)

您不应将这些.env文件与其他源文件一起提交和共享。因为那么在源代码中不硬编码配置有什么意义,对吧?

要导入这些值,您需要对其进行解析并将其注入到应用程序环境中。对于 Python,您可以使用python-dotenv库。

现在我们可以config.py改成:

# app.py
from flask import Flask
import config

app = Flask(__name__)
@app.route('/')
def home():
    return 'secret is ' + config.SECRET_KEY

app.run()
Run Code Online (Sandbox Code Playgroud)

这将允许我们从.env文件和环境变量加载配置。

一种常见的模式是创建一个.env.sample带有未填充键的文件,以提醒正在设置应用程序以填充这些值的管理员。

# .env.sample
SECRET_KEY=
SQLALCHEMY_DATABASE_URI=
Run Code Online (Sandbox Code Playgroud)

现在,至于你的问题:

设置环境变量和导出它是一样的吗?如果没有,如何在设置环境变量后导出环境变量以便我的应用程序可以工作?

“导出”环境变量与从控制面板设置它们相同。两者都是从源代码中删除秘密的方法。我在上面解释了两种使您的应用程序工作的方法。

在 .env 文件中存储环境变量与在控制面板中设置环境变量有何不同?因为当我尝试在 google 上搜索“在 windows 中编辑 .env 文件”时,出现了“添加环境变量”之类的结果。

将环境变量存储在.env文件中有点容易出错,因为服务器配置出现一个小错误,您可能会将这些秘密公开给所有人看。通过将它们设置为set/export您可以关闭该漏洞(如果黑客设法接管您的应用程序,他仍然可以获得这些漏洞,因为如果您注意到我们可以使用具有getenv功能的应用程序访问它)。

.bash_profile 和 .env 文件有什么区别?我运行 man bash 并说 .bash_profile 是个人初始化文件,为登录 shell 执行,但我不明白这是否意味着它与 .env 文件完全不同。

Bash 是 UNIX 系统中流行的 shell 应用程序。.bashrc是每次打开终端时都会执行的文件。因此,当您向其中添加export ENV_VAR=value命令时,您打开的每个终端都会有效地设置这些环境变量。