佈署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.txtpip 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 addimport 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.pyos.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_backend.prod")
個人遇到的一些坑
Procfile的P要大寫!不然heroku會抓不到檔案,導致服務未啟動(在HEROKU的頁面上可以看到服務是否正常啟動)- 若佈署後有些頁面路徑抓不到的話,可先將
DEBUG=True,PUSH上heroku後,看看錯誤訊息 - 確認自己的
.gitignore是否有少PUSH一些靜態檔案 - 若前後端分離的話(即後端用django,前端採框架開發),有
collectstatic後,開發時設定的STATICFILES_DIRS就可以拿掉了