【发布时间】:2019-08-06 12:05:59
【问题描述】:
我正在开发一个用于美国的 django 项目,特别是纽约时区,系统托管在 AWS 上,SES 发送电子邮件。
电子邮件后端使用django-anymail,它是SES 的简单包装器,系统使用来自django 核心的send_mail。
为了支持这一点,我选择了以下 Django 设置;
EMAIL_BACKEND = "anymail.backends.amazon_ses.EmailBackend"
LANGUAGE_CODE = 'en'
TIME_ZONE = 'America/New_York'
USE_I18N = False
USE_L10N = True
USE_TZ = True
ANYMAIL = {
"AMAZON_SES_CLIENT_PARAMS": {
"region_name": AWS_SES_REGION_NAME,
},
}
使用上述设置 django 在启动时调用tzset() 修改系统时区。这意味着botocore 用于签署 SES 请求的时间戳不是 UTC,因为从消息发送中收到以下错误;
调用 SendRawEmail 操作时发生错误(ExpiredToken):请求中包含的安全令牌已过期
将设置更改为TIME_ZONE = 'UTC',电子邮件发送成功。
我只能假设请求是在 UTC -4 中签名的,然后到达 UTC 中的 AWS。
django 如何在特定时区运行,但 boto 使用 UTC 时间戳运行?
系统在 docker 容器中运行(预生产);
- docker compose 3.4(unix 主机)
- python 2.7
- django 1.11
- django-anymail 3.0
-
LocaleMiddleware已加载
【问题讨论】:
-
什么版本的 Python 和 Django?什么版本的 boto3 和 botocore (
pip freeze | grep boto)?您是否有任何针对 Anymail 的 AMAZON_SES_CLIENT_PARAMS 或 AMAZON_SES_SESSION_PARAMS 的 Django 设置,如果有的话是什么? (我在 botocore 中看到了一些 possibly problematic 代码,但我找不到通过该路径的测试用例。我所有的重现尝试都很好。) -
另外,您的操作系统设置为什么操作系统和时区? (Django can't reliably 在 Windows 上更改 TIME_ZONE。至少有一个 boto3 issue 是关于 Windows 时区的。)另外,您是否将 Django 的 LANGUAGE_CODE 从默认的“en-us”更改为?你在加载 Django 的 LocaleMiddleware 吗?
-
最后,除非您的数据库已经是 America/New_York(并且您无法控制它),否则使用“it's still good practice”保持 Django 的默认
TIME_ZONE = 'UTC',并在此时进行时区转换您显示日期/时间(例如,使用timezone 模板过滤器)。 -
@medmunds 我添加了环境详细信息和 anymail 设置。它是 Unix 机器上基于 docker 的系统,因此 Windows 没有问题。我很欣赏坚持 UTC 是一种很好的做法,但是如果 django 具有移动时区的设置,那么利用它会很好。但也许我会考虑简单地本地化前端的值。
标签: django boto3 amazon-ses botocore django-anymail