佈署django到heroku
雖然heroku免費有限制
但對於一般的小專案或是自己練手的作品來說算夠用了!
佈署流程
- 打開terminal,安裝heroku並登入
brew install heroku heroku login
- 在專案根目錄(與
manage.py
同目錄)新建一個檔案:Procfile
(沒有副檔名),在heroku上用來啟動APP。注意!檔名的P要大寫。為了一個大小寫花了我2、3小時debug…Procfile
檔案裡面輸入:web: gunicorn blog.wsgi –log-file -
- 同樣在專案根目錄(與
manage.py
同目錄),新建Runtime.txt
,指定使用的Python版本。如不確定自己現在用的版本,可以下python -verson
確認。Runtime.txt
裡面輸入:python-3.6.5
- heroku會使用到
dj_database_url
、whitenoise
、gunicorn
,先手動安裝。接著產生requirements.txt
pip install dj_database_url pip install whitenoise pip install gunicorn pip freeze > requirements.txt
- 打開
settings.py
,修改資料庫及上線時應關閉的設定- ALLOWED-HOSTS,新增HEROKU網址或自定議的域名
- CORS_ORIGIN_ALLOW_ALL,開啟跨域限制 (有安裝
django-cors-headers
的話) - 先下
python manage.py collectstatic
集中靜態檔案,再設定靜態檔案路徑 - 關閉DEBUG模式(如上線一直失敗的話,可以先保持開啟找問題
import dj_database_url DATABASES = {'default':dj_database_url.config()} ALLOWED_HOSTS = ['127.0.0.1','myproject.herokuapp.com'] DEBUG = False CORS_ORIGIN_ALLOW_ALL = False STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, "static") TIME_ZONE = 'Asia/Taipei'
- 打開
wsgi.py
,新增DjangoWhiteNoise
。就多2行,位置如下方#heroku add
import os from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise #heroku add os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_backend.settings") application = get_wsgi_application() application = DjangoWhiteNoise(application) #heroku add
- 接著在terminal可以下
heroku local
,看看有沒有正常運作。理論上本機可以看到,上傳大概就不會有太大問題了! - 佈署到heroku!一樣在terminal,繼續輸入
git add . git commit -m "Added for deploy" heroku create 專案名稱 git push heroku master
- 接著就可以到專案網址看看自己的網站嘍!也可以直接下指令自動開啟專案網址!
heroku open
若專案有使用到資料庫的話
則可以下指令到heroku,叫django產生資料庫結構
heroku run python manage.py makemigrations
heroku run python manage.py migrate
heroku run python manage.py createsuperuser
補充說明:分離上線版跟開發版的settings.py
- 新建一個
prod.py
- 在
prod.py
中from .settings import *
,覆寫上版後要修改的參數。如DEBUG=False
,裡面大概長這樣:from .settings import * DEBUG = False CORS_ORIGIN_ALLOW_ALL = False
- 接著到
wsgi.py
,修改os.environ.setdefault
,指定到prod.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_backend.prod")
個人遇到的一些坑
Procfile
的P要大寫!不然heroku會抓不到檔案,導致服務未啟動(在HEROKU的頁面上可以看到服務是否正常啟動)- 若佈署後有些頁面路徑抓不到的話,可先將
DEBUG=True
,PUSH上heroku後,看看錯誤訊息 - 確認自己的
.gitignore
是否有少PUSH一些靜態檔案 - 若前後端分離的話(即後端用django,前端採框架開發),有
collectstatic
後,開發時設定的STATICFILES_DIRS
就可以拿掉了