Django + Heroku + WhiteNoise + AWS S3 用于Web应用的部署

首先

为了将使用Django创建的Web应用部署到Heroku,以及使用WhiteNoise管理静态文件和将图像存储与AWS进行对接,有一些零散解释的文章。然而,由于缺乏总结整个流程的文章,因此本文将试图概括并解释这一过程。

简而言之

在本文中,我们将解释如何使用Django创建的Web应用程序,使用WhiteNoise来管理静态文件,使用AWS S3来管理图像、视频等媒体文件,并最后使用Heroku进行部署。

准备

    1. 使用Django创建Web应用程序

 

    1. 创建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教程

广告
将在 10 秒后关闭
bannerAds