使用会话时,Flask需要一个密钥。在我看过的每个例子中,秘密密钥以某种方式生成,然后存储在源代码或配置文件中。
永久存储它的原因是什么?为什么不在应用程序启动时简单地生成它?
app.secret_key = os.urandom(50)
答案 0 :(得分:35)
密钥用于签署会话cookie。如果必须重新启动应用程序并重新生成密钥,则所有现有会话都将失效。这可能不是你想要的(或者至少,不是使会话无效的正确方法)。类似的情况可以用于依赖于密钥的任何其他东西,例如由itsdangerous生成的令牌以提供重置密码URL(例如)。
应用程序可能需要重新启动,因为崩溃,或者因为服务器重新启动,或者因为您正在推送错误修复或新功能,或者因为您正在使用的服务器产生新进程等等所以您可以不依赖服务器永远在用。
标准做法是将一些一次性密钥提交给repo(以便在dev机器上有某些),然后在部署时在本地配置中设置密钥。这样,密钥不会泄露,也不需要重新生成。
还有运行依赖于应用程序上下文的辅助系统的情况,例如用于运行后台任务的Celery或应用程序的多个负载平衡实例。如果应用程序的每个运行实例具有不同的设置,则在某些情况下它们可能无法正常工作。