Deploying a Django App To Heroku Tutorial
後端有一個自動爬蟲的程式去抓圖片,可參考 auto_crawler_ptt_beauty_image 。
本專案將教大家如何將自己的 Django 佈署到 Heroku
Heroku 免費版本
- 可以創造 5個 app。
- 24小時一定要休息6小時的規定。
- 支援很多種程式語言。
- 有SSL ( https ) 。
更多說明請參考 Heroku
詳細的步驟可參考 Deploying-Flask-To-Heroku ,
下面將只介紹佈署 Django 要注意的步驟。
我的 project_name 為 ptt_beauty_images
設定 Procfile
web: gunicorn ptt_beauty_images.wsgi
更多說明請參考
https://devcenter.heroku.com/articles/django-app-configuration#the-basics
設定 Collectstatic
Disabling Collectstatic
heroku config:set DISABLE_COLLECTSTATIC=1
可參考 https://devcenter.heroku.com/articles/django-assets#collectstatic-during-builds
pip3 install whitenoise
這樣靜態檔案才會正常顯示.
詳細說明可參考 Using WhiteNoise with Django
在 settings.py 中加入以下東西,
設定 ALLOWED_HOSTS
ALLOWED_HOSTS = ['*']
記得把 DEBUG 修改為 False
DEBUG = False
設定 STATIC_ROOT
STATIC_ROOT = BASE_DIR / "staticfiles"
設定 WhiteNoise 到 MIDDLEWARE
MIDDLEWARE = [
# ...
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware",
# ...
]
Add compression
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
最後執行 python3 manage.py collectstatic
如果沒有任何錯誤, 再將產生出來的東西一起 push 到 Heroku 上.
設定 DATABASE
我使用 Heroku Postgres ,
詳細教學可參考 如何在 heroku 上使用 database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ.get('DATABASE_NAME'),
'USER': os.environ.get('DATABASE_USER'),
'PASSWORD': os.environ.get('DATABASE_PASSWORD'),
'HOST': os.environ.get('DATABASE_HOST'),
'PORT': os.environ.get('DATABASE_PORT'),
}
}
請在自己 Heroku 的 Config Variables 設定 DATABASE 連線字串
順便介紹在 Django 中的 multiple-databases,
使用方法, 將 settings.py 裡的 DATABASES 修改成如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ.get('DATABASE_NAME'),
'USER': os.environ.get('DATABASE_USER'),
'PASSWORD': os.environ.get('DATABASE_PASSWORD'),
'HOST': os.environ.get('DATABASE_HOST'),
'PORT': os.environ.get('DATABASE_PORT'),
},
'db2': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ.get('DATABASE_NAME_2'),
'USER': os.environ.get('DATABASE_USER_2'),
'PASSWORD': os.environ.get('DATABASE_PASSWORD_2'),
'HOST': os.environ.get('DATABASE_HOST_2'),
'PORT': os.environ.get('DATABASE_PORT_2'),
}
}
這樣就代表你有兩個 DATABASES,更多資料可參考 Django multi-db
如果要指定 DATABASES 也非常容易,
假設我今天要用 'default' 這個 DB ,可以寫這樣
Image.objects.using('default').all()
假設我今天要用 'db2' 這個 DB,可以寫這樣
Image.objects.using('db2').all()
有沒有發現,其實就是 using('database name') 這樣,非常簡單
更多資料可參考 Django manually-selecting-a-database
指令如下
heroku stack:set heroku-22 -a <app name>
之後再 commit push 一次就會自動 migrate 到新的 stack.
- Python 3.9
文章都是我自己研究內化後原創,如果有幫助到您,也想鼓勵我的話,歡迎請我喝一杯咖啡:laughing:
MIT license