将Django应用部署到Heroku的方法
首先
由于在Heroku上无法运行我用Django开发的应用程序,我记录下了遇到的问题。
假设
-
- gitはインストール済
-
- Herokuアカウント作成済
-
- HerokuCLIインストール済
- デプロイしたいDjangoアプリは完成している
安装软件包
django工具包
pip install django-toolbelt
请点击这里查看详细信息。
安装这个将安装以下包。
-
- Django
Django本体
psycopg2
PythonでpostgreSQLを扱いやすくする
gunicorn
HerokuでDjangoをデプロイするときに推奨されている、Webサーバー
dj-database-url
dj-static
白噪音
pip install whitenoise
这个库简化了为WSGI应用程序提供静态文件的分发工作。
修改Django项目
为了将其部署到Heroku,必须添加或修改以下文件。
-
- requirements.txt
アプリを動かすために必要なパッケージを一覧としてまとめておくファイル
Procfile
Herokuプロセスの起動コマンド
runtime.txt
使用するPythonのバージョンを指定
.gitignore
sqliteとかが一緒に入らないようにする
wsgi.py
setting.pyから環境変数を受け取ってDjangoを動かしている…らしい
关于创建requirements.txt文件的要求
可以通过下列方式创建文件
pip freeze > requirements.txt
文件的内容如下所示。
dj-database-url==0.5.0
Django==2.2.3
django-toolbelt==0.0.1
gunicorn==19.9.0
Procfile(示例)
web: gunicorn <your-project-name>.wsgi --log-file -
运行时间文件(示例)
python-3.6.1
.gitignore 文件
*.pyc
venv
staticfiles
db.sqlite3
wsgi.py -> 网关接口.py
import os
from dj_static import Cling
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_project_name.settings")
application = Cling(get_wsgi_application())
将创建的文件放置在以下位置。
├─django_project_name
│ db.sqlite3
│ manage.py
│ Procfile ☆
│ requirements.txt ☆
│ runtime.txt ☆
│ .gitignore ☆
│
├─django_app_name
│ admin.py
│ apps.py
│ forms.py
│ models.py
│ tests.py
│ urls.py
│ views.py
│ __init__.py
│
└─django_project_name
settings.py
urls.py
wsgi.py ☆
__init__.py
修改Django配置文件
接下来,需要修改设置文件「settings.py」。
数据库设置
在Heroku上,DB使用的是postgres(不能使用SQLite?)。因此,必须根据运行环境更改所使用的DB配置。另外,也要将DEBUG设置为False。
我参考了以下方法来学习写作:
– 使用Django2.0在Heroku上进行部署的步骤。
# hostnameが自分のpcの場合は、sqliteに接続する
# そうでない場合はherokuのpostgresに接続する
from socket import gethostname
hostname = gethostname()
if "myhostname" in hostname:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
ALLOWED_HOSTS = []
else:
# 本番環境ではデバッグモードはfalseにしておく
DEBUG = False
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES = {
'default': dj_database_url.config()
}
ALLOWED_HOSTS = ['*']
有关静态文件的配置
把DEBUG设置为false后,一些静态文件如CSS就不会应用了。
在将应用部署到Heroku或Web服务器时,需要将所有静态文件放置在一个地方。
首先,在settings.py中需要写下集中静态文件的位置等设置。
import os
# settingsファイルのパスが入る
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# manage.pyのcollectstaticをした時に、静的ファイルがどこに格納されるか指定する
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# HerokuやWebサーバーに静的ファイルを見に行く場所を指定する
STATIC_URL = '/static/'
# 各アプリケーションのstatic以外に配信するディレクトリがある場合に追加
STATICFILES_DIRS = (
os.path.join(BASE_DIR, '..', 'django_app_name', 'static'),
)
另外,在安装了whitenoise后需要进行设置,将MIDDLEWARE中的’django.middleware.security.SecurityMiddleware’后面添加上去。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', ☆追加部分
'django.contrib.sessions.middleware.SessionMiddleware',
...
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
在添加上述说明之后,请执行下面的命令。
python manage.py collectstatic
然后,在指定的位置创建了一个static文件夹,并收集了静态文件。
├─django_project_name
│ db.sqlite3
│ manage.py
│ Procfile
│ requirements.txt
│ runtime.txt
│
├─django_app_name
│ admin.py
│ apps.py
│ forms.py
│ models.py
│ tests.py
│ urls.py
│ views.py
│ __init__.py
│
└─django_project_name
static ☆
settings.py
urls.py
wsgi.py
__init__.py
将应用部署到Heroku
假设下面的内容已经准备好,我们不在这里讨论。
-
- 关于Heroku账户,请参考以下内容:
-
- Git
-
- 请参考此处
-
- Heroku命令行界面
- 请从这里开始
请先提交一下
$ cd django_project_name
$ git init
$ git add .
$ git commit -m "はじめてのコミット"
安装HerokuCLI后,您将能够使用Heroku命令。请使用以下命令以在创建Heroku帐户时使用的信息登录。
$ heroku login
接下来,请转移到要部署的应用程序的重新装修,并输入以下命令。
$ heroku create
> Heroku上にアプリを作成する。
$ git push heroku master
> Heroku上にソースコードを渡す。
$ heroku run python manage.py migrate
> ここでもmigrateをしてあげる
$ heroku ps:scale web=1
$ heroku open
搞糟了!
以上则应该已经部署。