Django + Heroku + WhiteNoise + AWS S3 用于Web应用的部署
首先
为了将使用Django创建的Web应用部署到Heroku,以及使用WhiteNoise管理静态文件和将图像存储与AWS进行对接,有一些零散解释的文章。然而,由于缺乏总结整个流程的文章,因此本文将试图概括并解释这一过程。
简而言之
在本文中,我们将解释如何使用Django创建的Web应用程序,使用WhiteNoise来管理静态文件,使用AWS S3来管理图像、视频等媒体文件,并最后使用Heroku进行部署。
准备
-
- 使用Django创建Web应用程序
-
- 创建AWS帐户
- 创建Heroku帐户
Web应用程序的开发环境
环境
Python 是 3.6.7 版本
Django 是 1.11.15 版本
样例应用程序
我们将按照以下的应用程序结构来进行。
sample
├──Procfile
├── blog
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
├── requirements.txt
├── config
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── runtime.txt
├── templates
├── static
└── myvenv
请注意,myvenv是virtualenv(虚拟环境)。
此外,我们假设迁移文件已经创建。(python manage.py makemigrations)
首先,您需要使用以下命令来启动虚拟环境。
$ source myvenv/bin/activate
各种设置 (Gè
首先,需要安装所需的软件包。
(myvenv)$ pip install gunicorn
(myvenv)$ pip install dj-database-url
(myvenv)$ pip install psycopg2
(myvenv)$ pip install psycopg2-binary
在Prockfile中,指定了wsgi.py的存储位置如下。
web: gunicorn config.wsgi
接下来,在runtime.txt文件中需要按以下方式进行描述。(指定在Heroku上运行的Python版本)
如果不指定Python的最新版本,将会从Heroku上收到警告。
python-3.6.7
接下来是编辑wsgi.py文件。
初始状态下,相应部分为“项目名.settings”,但由于本次配置下有settings.py文件在config文件夹中,因此将其改为如下所示。
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") #変更
application = get_wsgi_application()
由于Heroku不支持SQLite,所以需要在setting.py中添加以下代码。
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
DEBUG = False
ALLOWED_HOSTS = ['*']
静态文件
为了管理静态文件,我们需要安装WhiteNoise。
(myvenv)$ pip install whitenoise
接下来,我们将编辑settings.py文件。
在MIDDLEWARE中添加whitenoise.middleware.WhiteNoiseMiddleware。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', #追加
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
可以在settings.py文件中添加以下代码。
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'static_root')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
请执行以下命令,最后会生成一个名为static_root的文件夹。这样静态文件的准备工作就完成了。
(myvenv)$ python manage.py collectstatic
媒体文件
AWS的各种配置
要在AWS S3中管理媒体文件,您需要创建AWS帐户并进行AWS上的各种设置。
有关管理本次目的中媒体文件的AWS设置,可以参考以下文章:
使用Django在AWS S3中管理静态文件和媒体文件
在上述文章中,静态文件和媒体文件都在AWS S3中进行管理,但由于本次只使用White Noise管理静态文件,所以只将媒体文件在AWS S3中进行管理。
另外,对于AWS端的设置,以下文章也可能会有所帮助。
[Django] 文件上传功能的使用方法 [云存储篇]
包裹,添加代码
完成 AWS 的配置后,安装所需的软件包。
(myvenv)$ pip install django-storages
(myvenv)$ pip install boto3
然后,在settings.py的INSTALLED_APPS中添加’stoages’。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
'storages', #追加
]
此外,将以下代码添加到settings.py文件中。
Access Key等可以在AWS设置时获取。
还可以在AWS_LOCATION中指定媒体文件的存储位置。
AWS_ACCESS_KEY_ID = 'アクセスキー'
AWS_SECRET_ACCESS_KEY = 'シークレットアクセスキー'
AWS_STORAGE_BUCKET_NAME = '<作成したバケットの名前>'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'media'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
通过这个方式,Web应用中上传的媒体文件将被存储到AWS S3创建的存储桶中的media/文件夹中。
将代码部署到Heroku上。
使用以下命令安装Heroku Toolbelt,并能够执行Heroku命令。
brew install heroku/brew/heroic
接下来,我们要将已安装的软件包写入到requirements.txt文件中。
(myvenv)$ pip freeze > requirements.txt
接下来,输入以下git命令,对之前创建的文件进行提交。
(myvenv)$ git init
(myvenv)$ git add -A .
(myvenv)$ git commit -m 'first commit'
最后,按顺序执行以下的Heroku命令。
如果能成功通过Heroku open打开创建的应用程序,那就算是成功了。
(myvenv)$ heroku login
(myvenv)$ heroku create
(myvenv)$ heroku config:set DISABLE_COLLECTSTATIC=1
(myvenv)$ git push heroku master
(myvenv)$ heroku ps:scale web=1
(myvenv)$ heroku run python manage.py migrate
(myvenv)$ heroku open
请参考
用AWS S3管理Django、静态文件和媒体文件
[Django] 文件上传功能的使用方法[云存储篇]
解决在将Django应用部署到Heroku时的错误-whitenoise篇
将Django应用部署到Heroku[第一部分]
[Django] 2018年版的Heroku部署方法
Django Girls教程