如何在Django 2.0上使用Heroku进行部署的步骤
這篇文章是關於初學者第一次在Heroku上部署Django應用程序的更新版本。
这次在Heroku上上传博客时,由于忘记了各种部署方法,所以记录在这里作为备忘。
前提 tí)
-
- 一般的なネットワーク環境(ファイルをアップロードするので)
-
- Djangoアプリ完成済み(sqlite3データベース使用)(virtualenv使用済み)
-
- windows powershellが使える
-
- gitインストール済み
- Herokuアカウント所有済み
环境
本次的环境如下所示:将使用django2.0
– windows10
– django 2.0
– python 3.6
最初的目录结构
DjangoApp/
├ env/(虚拟环境)
├ manage.py
├ db.sqlite3
├ DjangoApp/
│ ├ wsgi.py
│ └ setting.py
├ App/(应用本体)
└ .gitignore(排除env/、db和*.pyc)
准备好要开始了。
进程文件
听说这是告诉Heroku如何启动该应用程序的方式!☆
web: gunicorn アプリ名.wsgi --log-file -
运行时间.txt
给Heroku提供当前使用的Python版本的方法。
python-3.6.x
如果不安装最新的东西,部署时Heroku会发火,但对操作没有影响。
模块安装
请在您的设备上安装以下两个模块。
django-toolbelt
デプロイするときに役に立つモジュール一覧
whitenoise
静的ファイルを扱うときに必要
pip install django-toolbelt
pip install whitenoise
要求文本
只需运行pip freeze命令,即可使用用于列出Heroku上运行应用时所需的模块清单文件。
pip freeze > requirements.txt
目前的目录结构
三件神器制作完成後
DjangoApp文件夹中包含了以下文件:
├ env/ (环境文件夹)
├ manage.py
├ db.sqlite3
├ DjangoApp/
│ ├ wsgi.py
│ └ setting.py
├ App/ (应用文件夹)
├ requirements.txt (新建)
├ runtime.txt (新建)
├ Procfile (新建)
└ .gitignore
在setting.py中进行修改。
数据库相关
在Django中,默認使用SQLite3作為數據庫,在Heroku中默認使用Postgres。因此需要更改Django處理的數據庫。
在setting.py文件中查找以下部分。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
请按照以下方式重写此部分。
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES = {
'default': dj_database_url.config()
}
将环境改为正式环境
当您在本地开发Django时,DEBUG应该是为True的(根据不同的环境可能会有所不同)。
在Heroku上,我们将DEBUG设置为False。
然而,如果DEBUG为False,即使出现错误,有时也无法在日志中记录下来,因此我们将添加一个配置来在控制台上以调试级别显示日志。
将以下内容添加到setting.py文件中。
DEBUG = False # DEBUG=Trueから書き換え
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
},
},
}
将生产环境和开发环境进行切换。
为了避免切换环境变得繁琐,建议根据运行环境的不同进行上述更改,这样会更加方便。
from socket import gethostname
hostname = gethostname()
if "COMPUTER-NAME" in hostname:
# デバッグ環境
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
ALLOWED_HOSTS = [] # よくわからんけど、これも大事らしい
else:
# 本番環境
DEBUG = False
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
},
},
}
# DB設定
import dj_database_url
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
db_from_env = dj_database_url.config()
DATABASES = {
'default': dj_database_url.config()
}
ALLOWED_HOSTS = ['*']
请您输入计算机名作为您的主机名称。
将whitenoise添加到中间件中
让我们在setting.py中添加whitenoise到MIDDLEWARE。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', # 追加した
'django.contrib.sessions.middleware.SessionMiddleware',
...
]
并添加。就白噪声的文档而言,写着要在’django.middleware.security.SecurityMiddleware’之后添加,但是否必需不明确。
编辑wsgi.py文件
现在是时候去修改一直没碰过的本地环境的wsgi.py文件了。
将wsgi.py文件编辑如下。
import os
from dj_static import Cling
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "アプリ名.settings")
application = Cling(get_wsgi_application())
现在开始部署!
已经走到这一步,只剩下一点点了。
按照下面的方式输入命令,将代码部署到Heroku上吧。
git add .
git commit -am "Launching now!"
heroku login
> Enter your Heroku credentials.
> Email: hoge@huga.com
> Password (hidden):
> Logged in as hoge@huga.com
heroku create NAME
> https://NAME.herokuapp.com/ | https://git.heroku.com/NAME.git
git push heroku master
> なんか長々としたsomething
heroku run python manage.py migrate
> いつものmigrateコマンドが流れる
heroku run python manage.py collectstatic
> Copying...
heroku open
请访问https://NAME.herokuapp.com/,看看是否有效。
嗯,刚开始可能会出现某些错误,可能无法正常运行……