佈署django到heroku

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

佈署流程

  1. 打開terminal,安裝heroku並登入
    brew install heroku
    heroku login
  2. 在專案根目錄(與manage.py同目錄)新建一個檔案:Procfile(沒有副檔名),在heroku上用來啟動APP。注意!檔名的P要大寫。為了一個大小寫花了我2、3小時debug…Procfile檔案裡面輸入:
    web: gunicorn blog.wsgi –log-file -
  3. 同樣在專案根目錄(與manage.py同目錄),新建Runtime.txt,指定使用的Python版本。如不確定自己現在用的版本,可以下python -verson確認。Runtime.txt裡面輸入:
    python-3.6.5
  4. heroku會使用到dj_database_urlwhitenoisegunicorn,先手動安裝。接著產生requirements.txt
    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模式(如上線一直失敗的話,可以先保持開啟找問題
      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
    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,繼續輸入
    git add .
    git commit -m "Added for deploy"
    heroku create 專案名稱
    git push heroku master
    
  9. 接著就可以到專案網址看看自己的網站嘍!也可以直接下指令自動開啟專案網址!
    heroku open

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

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,裡面大概長這樣:
    from .settings import *
    
    DEBUG = False
    CORS_ORIGIN_ALLOW_ALL = False
  3. 接著到wsgi.py,修改os.environ.setdefault,指定到prod.py
    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)