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 文件。有人可以帮帮我吗 ?我有几个问题:
我需要添加/修复什么才能使我的应用程序正常工作?
设置环境变量和导出它是一样的吗?如果没有,如何在设置环境变量后导出环境变量以便我的应用程序可以工作?
在 .env 文件中存储环境变量与在控制面板中设置环境变量有何不同?因为当我尝试在 google 上搜索“在 windows 中编辑 .env 文件”时,出现了“添加环境变量”之类的结果。
.bash_profile 和 .env 文件有什么区别?我跑了man bash,它说 .bash_profile is The personal initialization file, executed for login shells,但我不明白这是否意味着它与 .env 文件完全不同。
从控制面板设置环境变量的问题在于,要检测这些变量的变化的程序,需要关闭并重新打开。但是,当您运行程序时,它会从其父进程继承环境变量。所以你也需要关闭它,一直持续到explorer.exe. 所以有点棘手。
所以你需要遵循不同的方法。
您可以使用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命令时,您打开的每个终端都会有效地设置这些环境变量。
| 归档时间: |
|
| 查看次数: |
6073 次 |
| 最近记录: |