【问题标题】:Setting up environmental variables in Python在 Python 中设置环境变量
【发布时间】:2019-12-23 16:16:56
【问题描述】:

长时间的爬行者,第一次来电。 我试图创建和使用environ var从settings.py文件发送gmail(smtp),但显然我做错了,因为当我输入密码时它起作用了,但是当我使用os.environ.get隐藏密码。

我认为我没有正确调用环境变量,但我不知道!我遇到了身份验证错误

import os

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'xxxx----@gmail.com'
EMAIL_HOST_PASSWORD = 'Thisworkedfine'

但是当我在我的系统属性中定义“EMAIL_USER”和“EMAIL_PASS”后,它没有工作。


EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')

来自地狱的错误:

SMTPSenderRefused at /password-reset/
(530, b'5.5.1 Authentication Required. Learn more at\n5.5.1  https://support.google.com/mail/?p=WantAuthError c2sm2597974pjs.13 - gsmtp', 'webmaster@localhost')

哈哈!

【问题讨论】:

  • 你是如何在主机上设置环境变量的?设置文件对我来说很好。
  • 您的假设是从环境中读取密码不起作用。通过打印EMAIL_HOST_PASSWORD 的内容来检验你的假设怎么样?
  • 当我打印EMAIL_HOST_PASSWORD 时,它似乎没有注册我在myEnvVal.py 文件中为密码设置的字符串...我只是尝试如下所述设置,通过创建' myEnvVal.py' 文件并导入。

标签: python email django-settings


【解决方案1】:

一种方法是在另一个 python 文件中设置变量并导入该文件。

创建一个文件说,myEnvVal.py

import os
# Set environment variables
def setVar():
    os.environ['EMAIL_USER'] = 'xxxx----@gmail.com'
    os.environ['EMAIL_PASSWORD'] = 'Thisworkedfine'

现在导入这个文件

import os
import myEnvVal
myEnvVal.setVar()
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')

【讨论】:

  • 谢谢朋友!不幸的是,它仍然没有工作。不知道为什么。
  • @Natasha 转到Allow less secure apps 并选择“允许”以允许不太安全的应用访问您的 Google 帐户,然后重试。
  • 是的,我做到了。我认为更多的是关于我如何设置变量。 TBH 我确定我做错了。
  • 来自myEnvVal.py 文件import os #set environment variables def setVar(): os.environ['EMAIL_USER'] = "xxxx" os.environ['EMAIL_PASS'] = "Ohnothisannoysme1!"
  • 在打印这些变量时,您得到的值是否相同?另外,请检查电子邮件或密码是否有拼写错误。
【解决方案2】:

我强烈推荐在 python 中使用 dotenv 模块,我个人认为这是处理环境变量最省心的方法。

将所有环境变量放入一个 .env 文件中,该文件只是键值对。 所以你的 .env 文件的内容看起来像这样:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'xxxx----@gmail.com'
EMAIL_HOST_PASSWORD = 'Thisworkedfine'

然后,您可以在要使用 envar 的任何 python 文件中执行以下操作:

import os
from dotenv import load_dotenv

EMAIL_BACKEND = os.getenv('EMAIL_BACKEND')

然后确保将您的 .env 包含在您的 .gitignore 中,以便您的秘密始终保持在本地。

有关更多信息,请查看 dotenv github repo here

【讨论】:

  • 谢谢!好主意。
【解决方案3】:

在另一个文件(类似 envvar.py)中创建两个变量。一个用于电子邮件,一个用于密码:

email = "me@something.com"
password = "somepassword"

然后在您的设置文件中:

import envvar

EMAIL_HOST_USER = envvar.email
EMAIL_HOST_PASSWORD = envvar.password

然后将 envvar 添加到你的 gitignore 中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多