2015-09-16 52 views
2

我有一個基本的Django應用程序(Newsdiffs),運行得很好localhost:8000python website/manage.py runserver,但我想遷移到Heroku,我無法弄清楚我的下一步是什麼。如何在Heroku上將現有的django應用程序/項目部署/遷移到生產服務器?

我認爲讓它在本地運行會轉化爲在Heroku上運行它,但我意識到python website/manage.py runserver正在啓動dev設置,我不知道如何告訴它使用主設置。

所有這一切都在我的Procfile是這樣的:

網站:蟒蛇網站/ manage.py runserver命令

本地,工作正常,但它在http://127.0.0.1:8000/啓動它這可能不是我想要的Heroku的。那麼我怎麼知道在哪裏設置主機名和端口?我沒有看到任何應用程序在任何地方。

+1

檢查settings.py中。 Debug = flase ..一些設置可能是他們的.. – csharpcoder

+0

你爲什麼認爲需要設置主機名和端口?你沒有。但是您確實需要閱讀Heroku網站上關於運行Django的非常全面的文檔。 –

+0

例如,我無法想象是什麼讓您將runserver放置在您的Procfile中。你需要在那裏使用gunicorn。 –

回答

1

如果你知道一些Python,有很多在其它語言經驗的基礎上的網絡應用程序,但不完全理解其中的Heroku適合,我強烈建議Discover Flask,該修補的很多孔在我的這些作品是如何協同工作的認識。

一些我摸索出了事情:

  • 你真的需要一個獨立的虛擬環境中,如果你要部署到Heroku的,因爲Heroku的從requirements.txt文件安裝Python模塊。

  • Gunicorn是一個Web服務器,你一定要運行Gunicorn根據您的應用程序,否則將無法在Heroku上運行。

  • "Procfile"不只是給你使用在本地運行的應用程序的命令。 Heroku需要它。所以,如果你有一個構建在Heroku上運行的應用程序,並且它不包含Procfile,他們就會留下一些東西。

  • 你不告訴Heroku的您的主機名是什麼。當你運行heroku create它應該告訴你你的域名將會是什麼。每次你運行git push heroku master(或者你推的任何分支,也許它不是master),Heroku會(嘗試)重新啓動你的應用程序。

  • 的Heroku doesn't support sqlite。您必須在Postgres中運行您的Production DB。

這並沒有直接回答我的問題,但它確實填補了一些被使其難以缺失的部分對我連問正確的問題。 RTFM儘管如此。 :)

2

兩天前我剛剛爲自己畫了這張表。 按照Heroku's help pages for python中描述的步驟完成後,它被放在一起。

這絕不是絕對的,也不是完美的,它會改變,但它是一個有效的痕跡,因爲我可以把網站在線。

仍然存在一些問題,需要徹底檢查,例如, media/文件上傳目錄的位置應該/可能出於安全原因存在於您的項目之外(現在它可以正常工作,但是我注意到如果dyno睡覺,那麼文件不會被模板在之後達到/顯示)。 目錄staticfiles/也是如此(儘管這似乎工作正常)。

此外,您可能想將django的調試模式設置爲false。

所以在這裏,它是:

我到現有的Django應用程序部署到Heroku的第一步

假設:

一)Django項目是已經在虛擬環境

b)您已經收集了所有項目所需的包裝

pip freeze > requirements.txt 

,並致力於它的git

git add requirements.txt 
git commit -m 'my prj requirements' 

0)激活項目的虛擬環境

workon xyz #using virtualenvwrapper 

然後去Django項目目錄(DPD的簡稱)如果尚未採取有

cd ~/prj/xyz (or cdproject with virtualenvwrapper if setup properly) 

並創建一個新的git分支,用於heroku twiddling以防止搞砸東西

git checkout -b he 

1)創建在Heroku

heroku create xyz 

的應用程序,還增加了Heroku的爲您的回購

2的遠程)添加所需的軟件包來requirements.txt

vi requirements.txt 

add

dj-database-url==0.3.0 
django-postgrespool==0.3.0 
gunicorn==19.3.0 
psycopg2==2.6 
django-toolbelt==0.0.1 
static3==0.5.1 
whitenoise==2.0.3 

3)在當地VENV

pip install -r requirements.txt --allow-all-external 

4)設置安裝所有依賴Heroku的Django的設置

cd xyz 

創建一個副本

cp setting.py settings_heroku.py 

和編輯

vi settings_heroku.py 

import os 
import dj_database_url 

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),) 
MEDIA_ROOT = os.path.join(BASE_DIR, "media") 
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles") 
STATIC_URL = '/static/' 
MEDIA_URL = '/media/' 
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' 
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"] 
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 

DATABASES['default'] = dj_database_url.config() 
DATABASES['default']['ENGINE'] = 'django_postgrespool' 

WSGI_APPLICATION = 'xyz.wsgi_heroku.application' 

5)配置必要的環境變量(Heroku的CONFIGS)取代Django的性病DB CFG

編輯.env文件

vi .env 

例如

DJANGO_SECRET_KEY=whatever 
[email protected] 
EMAIL_HOST_PASSWORD=whateveritis 

和/或手動設置如果需要的話(在我的情況.env沒有效果,沒有明顯加載,而不得不手動設置瓦爾現在)

heroku config:set DJANGO_SECRET_KEY=whatever 
heroku config:set [email protected] 
heroku config:set EMAIL_HOST_PASSWORD=whateveritis 

6)創建對Heroku的

cd xyx 
cp wsgi.py wsgi_heroku.py 

獨立WSGI文件並編輯它,使之指向正確的設置

vi wsgi_heroku.py 
from whitenoise.django import DjangoWhiteNoise 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xyz.settings_heroku") 
application = get_wsgi_application() 
application = DjangoWhiteNoise(application) 

7)確保所有的模板使用

{% load staticfiles %} 

8)定義Procfile文件,使其指向正確的WSGI

例如

cd ~/prj/xyz (DPD) 
vi Procfile 

添加

web: gunicorn xyz.wsgi_heroku --log-file - 

9)收集所有的靜態內容到DPD/staticfiles/

本地,確保Django的指向右邊WSGI設置

export WSGI_APPLICATION=blogger.wsgi_heroku.application 
python manage.py collectstatic 

10)將更改添加到本地git回購(他分支)

git add --all . 
git commit -m 'first 4 heroku' 

11)檢查整個事情的作品在當地

heroku local # in heroku's help they also add `web`, not needed?! 

12)把你的代碼的Heroku

git push heroku he:master 

13)確保一個應用程序的實例運行

heroku ps:scale web=1 

14)在heroku DB上創建表格

heroku run python manage.py migrate 

注意:如果您看到一條消息:「您剛剛安裝了Django的身份驗證系統,這意味着您沒有定義任何超級用戶。你想現在創建一個嗎?「,輸入no。

15)超級用戶添加到Heroku的DB

heroku run bash 
python manage.py createsuperuser 

和補充細節,像往常一樣

16)填充DB必要的固定裝置

heroku run python manage.py loaddata yourfile.json 

17)訪問在Heroku上的Web服務器

heroku open 
01的網站的頁面個

或去

https://xyz.herokuapp.com/ 

和管理

https://xyz.herokuapp.com/admin/ 

和DB

https://xyz.herokuapp.com/db 

有用的命令:

  • 查看應用程序的日誌

    heroku logs [--tail]

  • 列表插件部署

    heroku addons

    ,並使用一個:

    heroku addons:open <add-on-name>

  • 運行在Heroku的命令(遠程ENV,在那裏你正在部署)

    heroku run python manage.py shell heroku run bash

  • 設置在Heroku上一個配置無功

    heroku config:set VARNAME=whatever

  • 查看所設置的配置瓦爾(包括DB的)

    heroku config

  • 查看postgres數據庫細節

    heroku pg

+0

因爲遷移是冪等的,有沒有辦法使遷移通過wsgi.py或settings文件進行部署運行? –

相關問題