用Django + Heroku + AWS S3来展示图片的方法

摘要

我将在Django应用中写下将图片保存到S3并在应用中显示的方法。
预期的处理流程是,①用户上传图片→②保存到S3→③从S3中显示图片到应用中。

另外,环境版本为Python 3.7.3和Django 2.2。

1. 亚马逊云服务配置

1-1. AWS注册

需要使用S3,需要有一个AWS账号,如果还没有,请从AWS注册页面进行注册。

参考:
AWS账户的创建流程
亚马逊S3

1-2. 创建桶。

请在搜索栏输入并点击”S3″。

s3.png

创建桶

s3-02.png

③请选择存储桶名称和地区。

s3-03.png

没有选项

这是一个选项,但这次我们不会进行设置。

s3-04.png

对以下内容进行中文本土化改写,只需一种选项:

⑤访问权限

请取消这个项目,在初始设置中,它会被阻止。

s3-05.png

确认内容并创建

s3-06.png

完成了一个篮子。( .)

s3-07.png

1-3. Cross-Origin Resource Sharing (CORS) configuration

移至CORS设置。

点击已创建的存储桶,进入”访问限制”下的”CORS设置”。

s3-08.png

将②添加到CORS配置编辑器中。

请按照以下方式进行添加。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
   <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

参考:跨源资源共享(CORS)
Python中的直接上传到S3文件| S3配置

1-4. 我们进行身份验证设置

搜索并点击IAM

a.png

请点击用户。

b.png

点击添加用户

c.png

请用户输入用户名,并通过程序进行访问验证。

d.png

⑤权限授予

搜索S3,并勾选AmazonS3FullAccess权限。

e.png

没有选项

这是一个选项,但这次我们不会设定。

f.png

确认并创作内容。

g.png

我已经完成了 ⑧IAM 的设置。

稍后,将使用访问密钥ID和秘密访问密钥,请不要关闭屏幕。

i.png

IAM是什么意思?

2. 应用设置

2-1. 安装

安装django-storages

$ pip install django-storages

参考:django-storages | 亚马逊 S3

安装Boto3

$ pip install boto3

参考资料:
Boto 3 文档
AWS Python SDK (Boto3)

設定檔案settings.py的設定-2.

请按照以下方式进行添加。

    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'your_app_name',
    'storages', #追加
]

    #追加
    AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
    AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
    AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']

    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
    MEDIA_URL = S3_URL

    AWS_S3_FILE_OVERWRITE = False
    AWS_DEFAULT_ACL = None

2-3. 环境变量

我将设置三个Heroku环境变量。

当您添加IAM用户时,AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY将显示为访问密钥ID和密钥访问密钥。

③ AWS_STORAGE_BUCKET_NAME是指所创建的桶(bucket)的名称。

$ heroku config:set AWS_ACCESS_KEY_ID="ご自身のアクセスキーIDを記入"
$ heroku config:set AWS_SECRET_ACCESS_KEY="ご自身のシークレットアクセスキーを記入"
$ heroku config:set AWS_STORAGE_BUCKET_NAME="ご自身のバケット名を記入"

参考:
Heroku – 配置和配置变量
Django 文档 – 部署检查清单

2-4. 请求清单

将安装的模块添加到requirements.txt文件中。

$ pip freeze > requirements.txt

2-5. 將local_settings.py進行設置

如果您使用local_settings.py,请参考下面的内容。

在本地环境中,可以从指定的目录(使用MEDIA_ROOT指定)读取文件,而在Heroku上可以从S3读取文件。

###
省略
###

DEBUG = False

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'your_app_name',
    'storages',
]

###
省略
###

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

try:
    from .local_settings import *
except ImportError:
    pass

if not DEBUG:
    SECRET_KEY = os.environ['SECRET_KEY']

    AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
    AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
    AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']

    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
    MEDIA_URL = S3_URL

    AWS_S3_FILE_OVERWRITE = False
    AWS_DEFAULT_ACL = None

    import django_heroku
    django_heroku.settings(locals())

db_from_env = dj_database_url.config(conn_max_age=600, ssl_require=True)
DATABASES['default'].update(db_from_env)
import os

SECRET_KEY = 'ご自身のSECRET_KEYを記入'

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

DEBUG = True

最后

如果您在Heroku上部署时感到不清楚,也可以参考下面的文章。

将Django应用部署到Heroku的步骤

以上 -> 这之上 (zhè zhī

广告
将在 10 秒后关闭
bannerAds