佈署django到heroku

雖然heroku免費有限制
但對於一般的小專案或是自己練手的作品來說算夠用了!

佈署流程

  1. 打開terminal,安裝heroku並登入

    1
    2
    brew install heroku
    heroku login
  2. 在專案根目錄(與manage.py同目錄)新建一個檔案:Procfile(沒有副檔名),在heroku上用來啟動APP。注意!檔名的P要大寫。為了一個大小寫花了我2、3小時debug…Procfile檔案裡面輸入:

    1
    web: gunicorn blog.wsgi –log-file -
  3. 同樣在專案根目錄(與manage.py同目錄),新建Runtime.txt,指定使用的Python版本。如不確定自己現在用的版本,可以下python -verson確認。Runtime.txt裡面輸入:

    1
    python-3.6.5
  4. heroku會使用到dj_database_urlwhitenoisegunicorn,先手動安裝。接著產生requirements.txt

    1
    2
    3
    4
    pip install dj_database_url
    pip install whitenoise
    pip install gunicorn
    pip freeze > requirements.txt
  5. 打開settings.py,修改資料庫及上線時應關閉的設定

    1. ALLOWED-HOSTS,新增HEROKU網址或自定議的域名
    2. CORS_ORIGIN_ALLOW_ALL,開啟跨域限制 (有安裝django-cors-headers的話)
    3. 先下python manage.py collectstatic集中靜態檔案,再設定靜態檔案路徑
    4. 關閉DEBUG模式(如上線一直失敗的話,可以先保持開啟找問題
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      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'
  6. 打開wsgi.py,新增DjangoWhiteNoise。就多2行,位置如下方#heroku add

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
  7. 接著在terminal可以下heroku local,看看有沒有正常運作。理論上本機可以看到,上傳大概就不會有太大問題了!

  8. 佈署到heroku!一樣在terminal,繼續輸入

    1
    2
    3
    4
    git add .
    git commit -m "Added for deploy"
    heroku create 專案名稱
    git push heroku master
  9. 接著就可以到專案網址看看自己的網站嘍!也可以直接下指令自動開啟專案網址!

    1
    heroku open

若專案有使用到資料庫的話
則可以下指令到heroku,叫django產生資料庫結構

1
2
3
heroku run python manage.py makemigrations
heroku run python manage.py migrate
heroku run python manage.py createsuperuser

補充說明:分離上線版跟開發版的settings.py

  1. 新建一個prod.py
  2. prod.pyfrom .settings import *,覆寫上版後要修改的參數。如DEBUG=False,裡面大概長這樣:

    1
    2
    3
    4
    from .settings import *

    DEBUG = False
    CORS_ORIGIN_ALLOW_ALL = False
  3. 接著到wsgi.py,修改os.environ.setdefault,指定到prod.py

    1
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_backend.prod")

個人遇到的一些坑

  1. Procfile的P要大寫!不然heroku會抓不到檔案,導致服務未啟動(在HEROKU的頁面上可以看到服務是否正常啟動)
  2. 若佈署後有些頁面路徑抓不到的話,可先將DEBUG=True,PUSH上heroku後,看看錯誤訊息
  3. 確認自己的.gitignore是否有少PUSH一些靜態檔案
  4. 若前後端分離的話(即後端用django,前端採框架開發),有collectstatic後,開發時設定的STATICFILES_DIRS就可以拿掉了

參考資料

Deploying Django Apps To Heroku
Django部署(Heroku)