django boto3:NoCredentialsError——无法找到凭据
django boto3: NoCredentialsError -- Ubale to locate credentials
我是 运行 django 网站,由 IIS 在亚马逊 ec2 实例 (windows 10) 上提供服务,我正在使用 boto3 模块发送电子邮件。
我安装了 awscli 和 运行 aws configure 并设置了我的 aws 访问密钥
我的电子邮件发送代码如下所示:
import boto3
from botocore.exceptions import ClientError
from django.shortcuts import redirect, render
from django.http import HttpResponseRedirect
def sendEmail(request):
if request.method == 'POST':
SENDER = "Sender Name <xxx>"
RECIPIENT = "xxx"
AWS_REGION = "eu-west-1"
# The subject line for the email.
SUBJECT = "Amazon SES Test (SDK for Python)"
# The email body for recipients with non-HTML email clients.
BODY_TEXT = ("Amazon SES Test (Python)\r\n"
"This email was sent with Amazon SES using the "
"AWS SDK for Python (Boto)."
)
# The HTML body of the email.
BODY_HTML = """<html>
<head></head>
<body>
<h1>Amazon SES Test (SDK for Python)</h1>
<p>This email was sent with
<a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the
<a href='https://aws.amazon.com/sdk-for-python/'>
AWS SDK for Python (Boto)</a>.</p>
</body>
</html>
"""
# The character encoding for the email.
CHARSET = "UTF-8"
# Create a new SES resource and specify a region.
client = boto3.client('ses', region_name=AWS_REGION)
try:
# Provide the contents of the email.
response = client.send_email(
Destination={
'ToAddresses': [
RECIPIENT,
],
},
Message={
'Body': {
'Html': {
'Charset': CHARSET,
'Data': BODY_HTML,
},
'Text': {
'Charset': CHARSET,
'Data': BODY_TEXT,
},
},
'Subject': {
'Charset': CHARSET,
'Data': SUBJECT,
},
},
Source=SENDER,
)
# Display an error if something goes wrong.
except ClientError as e:
print(e.response['Error']['Message'])
return render(request, 'error.html')
else:
print("Email sent! Message ID:"),
print(response['MessageId'])
return render(request, 'success.html')
其中 xxx 表示在 AWS 上经过验证的电子邮件。
我的错误是这样的:
Django Version: 3.0.3
Exception Type: NoCredentialsError
Exception Value:
Unable to locate credentials
Exception Location: c:\users\administrator\python38\lib\site-packages\botocore\auth.py in add_auth, line 357
Python Executable: c:\users\administrator\python38\python.exe
Python Version: 3.8.1
Python Path:
['.',
'c:\users\administrator\python38\python38.zip',
'c:\users\administrator\python38\DLLs',
'c:\users\administrator\python38\lib',
'c:\users\administrator\python38',
'c:\users\administrator\python38\lib\site-packages',
当这个网站只是 运行 在 CMD 中使用 "python manage.py runserver 0.0.0.0:80" 时,我曾经发送电子邮件,但是在我将它部署到 IIS 上并添加了 SSL 之后,它不再工作了。
我发现 apache 有点类似 ,但不知道如何适应我的情况。
我怀疑您遇到的问题是 IIS 和您的应用 运行 所属的有效用户与您为其配置凭据的用户(管理员)不同。因此,您的应用找不到凭据文件,因为它的主目录不同。
但是,这不是向 EC2 上的应用程序 运行 提供凭据的正确方法。相反,您应该使用 IAM 角色启动 EC2 实例,而不是在 ~/.aws/credentials
文件中的实例上手动配置凭据。
如果您不使用 aws cli,那么直接在 python 文件中您可以在 boto3 对象中指定 aws 访问密钥,例如:
client = boto3.client(
'ses',
region_name=AWS_REGION,
aws_access_key_id=aws_public_key_paste_here,
aws_secret_access_key=aws_secret_key_paste_here,
)
我是 运行 django 网站,由 IIS 在亚马逊 ec2 实例 (windows 10) 上提供服务,我正在使用 boto3 模块发送电子邮件。
我安装了 awscli 和 运行 aws configure 并设置了我的 aws 访问密钥
我的电子邮件发送代码如下所示:
import boto3
from botocore.exceptions import ClientError
from django.shortcuts import redirect, render
from django.http import HttpResponseRedirect
def sendEmail(request):
if request.method == 'POST':
SENDER = "Sender Name <xxx>"
RECIPIENT = "xxx"
AWS_REGION = "eu-west-1"
# The subject line for the email.
SUBJECT = "Amazon SES Test (SDK for Python)"
# The email body for recipients with non-HTML email clients.
BODY_TEXT = ("Amazon SES Test (Python)\r\n"
"This email was sent with Amazon SES using the "
"AWS SDK for Python (Boto)."
)
# The HTML body of the email.
BODY_HTML = """<html>
<head></head>
<body>
<h1>Amazon SES Test (SDK for Python)</h1>
<p>This email was sent with
<a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the
<a href='https://aws.amazon.com/sdk-for-python/'>
AWS SDK for Python (Boto)</a>.</p>
</body>
</html>
"""
# The character encoding for the email.
CHARSET = "UTF-8"
# Create a new SES resource and specify a region.
client = boto3.client('ses', region_name=AWS_REGION)
try:
# Provide the contents of the email.
response = client.send_email(
Destination={
'ToAddresses': [
RECIPIENT,
],
},
Message={
'Body': {
'Html': {
'Charset': CHARSET,
'Data': BODY_HTML,
},
'Text': {
'Charset': CHARSET,
'Data': BODY_TEXT,
},
},
'Subject': {
'Charset': CHARSET,
'Data': SUBJECT,
},
},
Source=SENDER,
)
# Display an error if something goes wrong.
except ClientError as e:
print(e.response['Error']['Message'])
return render(request, 'error.html')
else:
print("Email sent! Message ID:"),
print(response['MessageId'])
return render(request, 'success.html')
其中 xxx 表示在 AWS 上经过验证的电子邮件。
我的错误是这样的:
Django Version: 3.0.3
Exception Type: NoCredentialsError
Exception Value:
Unable to locate credentials
Exception Location: c:\users\administrator\python38\lib\site-packages\botocore\auth.py in add_auth, line 357
Python Executable: c:\users\administrator\python38\python.exe
Python Version: 3.8.1
Python Path:
['.',
'c:\users\administrator\python38\python38.zip',
'c:\users\administrator\python38\DLLs',
'c:\users\administrator\python38\lib',
'c:\users\administrator\python38',
'c:\users\administrator\python38\lib\site-packages',
当这个网站只是 运行 在 CMD 中使用 "python manage.py runserver 0.0.0.0:80" 时,我曾经发送电子邮件,但是在我将它部署到 IIS 上并添加了 SSL 之后,它不再工作了。
我发现 apache 有点类似
我怀疑您遇到的问题是 IIS 和您的应用 运行 所属的有效用户与您为其配置凭据的用户(管理员)不同。因此,您的应用找不到凭据文件,因为它的主目录不同。
但是,这不是向 EC2 上的应用程序 运行 提供凭据的正确方法。相反,您应该使用 IAM 角色启动 EC2 实例,而不是在 ~/.aws/credentials
文件中的实例上手动配置凭据。
如果您不使用 aws cli,那么直接在 python 文件中您可以在 boto3 对象中指定 aws 访问密钥,例如:
client = boto3.client(
'ses',
region_name=AWS_REGION,
aws_access_key_id=aws_public_key_paste_here,
aws_secret_access_key=aws_secret_key_paste_here,
)