首页 > 编程问答 >使用 DigitalOcean Spaces 在 Django 应用程序中初始化 boto3 会话时出错

使用 DigitalOcean Spaces 在 Django 应用程序中初始化 boto3 会话时出错

时间:2024-07-28 16:15:48浏览次数:9  
标签:python django backend boto3 digital-ocean

当我尝试将 Django 应用程序配置为使用 DigitalOcean Spaces 处理静态文件和媒体文件时,我遇到了问题。这是我的 settings.py 文件的相关部分:

import boto3
from botocore.exceptions import NoCredentialsError, PartialCredentialsError
from botocore.client import Config
from os import getenv

AWS_ACCESS_KEY_ID = getenv('SPACES_KEY')
AWS_SECRET_ACCESS_KEY = getenv('SPACES_SECRET')
AWS_STORAGE_BUCKET_NAME = getenv('BUCKET_NAME')
AWS_S3_REGION_NAME = "region"
AWS_S3_ENDPOINT_URL = f"https://{AWS_S3_REGION_NAME}.digitaloceanspaces.com"

AWS_S3_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

AWS_DEFAULT_ACL = 'public-read'
AWS_S3_SIGNATURE_VERSION = 's3v4'

STATIC_URL = f"{AWS_S3_ENDPOINT_URL}/{AWS_STORAGE_BUCKET_NAME}/static/"
MEDIA_URL = f"{AWS_S3_ENDPOINT_URL}/{AWS_STORAGE_BUCKET_NAME}/media/"

STATICFILES_STORAGE = 'name.custom_storages.StaticStorage'
DEFAULT_FILE_STORAGE = 'name.custom_storages.MediaStorage'

# Ensure the credentials are explicitly set for boto3
session = boto3.session.Session()
s3_client = session.client(
    's3',
    region_name=AWS_S3_REGION_NAME,
    endpoint_url=AWS_S3_ENDPOINT_URL,
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    config=Config(signature_version='s3v4')
)

# Test connection to S3
def test_s3_connection():
    try:
        print("Connecting to S3...")
        response = s3_client.list_objects_v2(Bucket=AWS_STORAGE_BUCKET_NAME)
        print("Connection successful. Contents:")
        for obj in response.get('Contents', []):
            print(obj['Key'])
    except NoCredentialsError:
        print("Error: No credentials found.")
    except PartialCredentialsError:
        print("Error: Incomplete credentials.")
    except Exception as e:
        print(f"Error: {e}")

test_s3_connection()

当我使用 python3 manage.py runserver 运行服务器时,出现以下错误:

Traceback (most recent call last):
  ...
  File "/Users/User/.aws/credentials"
botocore.exceptions.ConfigParseError: Unable to parse config file: /Users/User/.aws/credentials

我不希望 boto3 使用 ~/.aws 中的凭证/credentials 文件,因为我没有使用 AWS,而是使用 DigitalOcean Spaces。

任何有关如何解决此问题的帮助或建议将不胜感激。提前致谢!

已验证 AWS 凭证文件:

  1. 检查语法错误:我确保凭证文件中没有语法错误或格式问题。

  2. 环境变量:我确认环境变量 ( SPACES_KEY、SPACES_SECRET、BUCKET_NAME)在我的环境中设置正确。

  3. 更新了 boto3 和 botocore:我确保我的虚拟环境中安装了最新版本的 boto3 和 botocore。

  4. 调试日志:添加了打印语句和日志记录验证环境变量是否已正确加载并传递给 boto3。

  5. 我希望 Django 应用程序仅使用提供的环境变量来初始化 boto3 会话,而不引用 AWS 凭证文件。但是,我不断遇到与凭据文件相关的 ConfigParseError,并且无法继续操作。

任何有关如何解决此问题的见解或建议将不胜感激。


此错误表示,即使你正在提供凭证,boto3 仍然尝试从 AWS 凭证文件中加载凭证。要解决此问题,你可以通过以下方法之一明确指示 boto3 使用你提供的环境变量:

1. 使用 boto3.client 直接创建客户端:

你无需创建一个 boto3.session.Session 对象,而是可以直接创建 s3 客户端,并在那里传递你的凭证:

import boto3
from botocore.client import Config

# ... your other settings ...

s3_client = boto3.client(
    's3',
    region_name=AWS_S3_REGION_NAME,
    endpoint_url=AWS_S3_ENDPOINT_URL,
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    config=Config(signature_version='s3v4')
)

# ... your test_s3_connection function ...

此方法绕过了创建会话,从而防止 boto3 搜索凭证文件。

2. 使用 boto3.setup_default_session

此方法让你为 boto3 设置默认会话,并在那里提供你的凭证:

import boto3
from botocore.client import Config

# ... your other settings ...

boto3.setup_default_session(
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    region_name=AWS_S3_REGION_NAME
)

s3_client = boto3.client('s3', endpoint_url=AWS_S3_ENDPOINT_URL, config=Config(signature_version='s3v4'))

# ... your test_s3_connection function ...

这将设置一个默认会话,boto3 将使用该会话来创建所有后续的客户端,包括你的 s3_client

在这两种方法中,你都明确地提供了 boto3 所需的凭证,从而阻止它搜索凭证文件并解决 ConfigParseError

标签:python,django,backend,boto3,digital-ocean
From: 78803265

相关文章

  • Python科研武器库 - 文件/路径操作 - 判断路径是否存在
    使用场景:在科研中,用Python处理数据的一个核心目的是批量处理,批量处理节省了研究者大量的时间和精力,不然,还不如手动一个个地去处理。批量处理通常要求数据整体较为规整,能够进行统一的处理操作,但实际数据中总存在一些不规则的样本,甚至有些样本的命名都存在不规范,例如,整个数据集......
  • python刷题常用模板
    #=====================================素数筛Begin=====================================#MAXN=1000prime=[]isprime=[True]*(MAXN+1)defeuler():isprime[1]=Falseforiinrange(2,MAXN+1):ifisprime[i]:prime.append(i)......
  • [附开题]flask框架的全国汽车销售信息查询系统的设计与实现7m1w0(python+源码)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着中国汽车市场的蓬勃发展,汽车品牌的日益丰富以及消费者购车需求的多样化,汽车销售信息的准确性与时效性成为了市场关注的焦点。传统汽车......
  • [附开题]flask框架的校园停车场管理系统的设计与实现61m0e(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及和校园规模的不断扩大,校园内车辆数量急剧增加,停车难问题日益凸显。传统的人工停车场管理模式已难以满足现代校园对高效......
  • [附开题]flask框架的校园学生管理系统s8h32(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着教育技术的不断进步和高校规模的不断扩大,传统的学生管理方式已难以满足现代校园管理的需求。学生数量激增、课程种类繁多、选课流程复......
  • [附开题]flask框架的校园疫情管理系统92tl0(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着新冠疫情的持续影响,校园作为人群密集、流动性大的场所,其疫情防控工作显得尤为重要。传统的手工记录和口头报告方式已难以满足当前复杂......
  • 如何从 python 脚本将事件和上下文传递到 AWS lambda?
    我正在创建一个cli应用程序,我想用它来调用我的AWSlambda函数:@click.group(context_settings={"help_option_names":["-h","--help"]},invoke_without_command=True)@click.version_option(version=__version__,prog_name="experiment")def......
  • 有没有办法检查是否有人提到@youtubechannelname并使用youtube数据api让Python脚本回
    标题解释了大部分内容。我的问题是,尽管到处搜索,但我没有找到任何有用的解决方案。AI和ChatGPT都无法对此提供帮助。不幸的是,YouTube数据API不提供直接监控频道提及或自动回复评论的功能。YouTube数据API主要用于检索和管理YouTube上的视频、评论和其他资源,而......
  • 在 Google Colab 上运行 Django:错误 403 Forbidden
    我正在尝试对我的Python程序的Colab进行一些测试并使用Django。我按照此链接中的说明进行操作。我确保在settings.py中设置了此设置ALLOWED_HOSTS=['*']运行此命令以获取链接https://randomstrings.colab.googleusercontent.com/fromgo......
  • 如何在 Python 中从 Milesight TrafficX 摄像头、Post(MQTT、TCP/IP、HTTP) 获取数据?
    你好,祝你度过愉快的一天或一夜,我有这个MilesightTrafficX摄像头已启动并正在运行,仪表板中有一个名为POST的设置,您可以在下图中看到:我想要的是知道如何设置这些设置(基于实际上我的意思是)能够在我的Python代码中接收数据。无论协议如何,数据都将如下所示:......