用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″。
创建桶
③请选择存储桶名称和地区。
没有选项
这是一个选项,但这次我们不会进行设置。
对以下内容进行中文本土化改写,只需一种选项:
⑤访问权限
请取消这个项目,在初始设置中,它会被阻止。
确认内容并创建
完成了一个篮子。( .)
1-3. Cross-Origin Resource Sharing (CORS) configuration
移至CORS设置。
点击已创建的存储桶,进入”访问限制”下的”CORS设置”。
将②添加到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
请点击用户。
点击添加用户
请用户输入用户名,并通过程序进行访问验证。
⑤权限授予
搜索S3,并勾选AmazonS3FullAccess权限。
没有选项
这是一个选项,但这次我们不会设定。
确认并创作内容。
我已经完成了 ⑧IAM 的设置。
稍后,将使用访问密钥ID和秘密访问密钥,请不要关闭屏幕。
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ī