Python項目 | Web應用程序之Heroku部署

部署應用

將其部署到一臺服務器,讓任何有網絡連接的人都能夠使用它。爲此,將使用Heroku,這是一個基於Web的平臺,能夠管理Web應用程序的部署。讓“學習筆記”在Heroku上運行。

1、建立Heroku賬戶

建立賬戶,訪問https://heroku.com/ ,並單擊其中的一個註冊鏈接。註冊賬戶是免費的,Heroku提供了免費試用服務,能夠將項目部署到服務器並對其進行測試。

其中註冊的郵箱需要是gmail郵箱或者其他國外郵箱,國內郵箱不行。

2、安裝Heroku Toolbelt

要將項目部署到Heroku的服務器並對其進行管理,需要使用HerokuToolbelt提供的工具。要安裝最新的HerokuToolbelt版本,訪問https://toolbelt.heroku.com/ ,並根據使用的操作系統按相關的說明做。

驗證heroku是否安裝,執行命令:heroku --version

3、安裝必要的包

在活動的虛擬環境中執行如下命令:

pip install dj-database-url
pip install dj-static
pip install static3
pip install gunicorn

dj-database-url 包幫助Django與Heroku使用的數據庫進行通信,dj-static 和static3 包幫助Django 正確地管理靜態文件,而gunicorn 是一個服務器軟件,能夠在在線環境中支持應用程序提供的服務。(靜態文件包括樣式規則和JavaScript文件。)

4、創建包含列表的文件requirements.txt

Heroku需要知道項目依賴於哪些包,因此使用pip來生成一個文件,其中列出了這些包。同樣,進入活動虛擬環境,並執行如下命令:

命令freeze 讓pip將項目中當前安裝的所有包的名稱都寫入到文件requirements.txt中。打開文件requirements.txt,查看項目中安裝的包及其版本(如果使用的是Windows系統, 看到的內容可能不全):

“學習筆記”依賴於6個特定版本的包,因此需要在相應的環境中才能正確地運行。部署“學習筆記”時,Heroku將安裝requirements.txt列出的所有包,從而創建一個環境,其中包含在本地使用的所有包。

接下來,在包列表中添加psycopg2 ,它幫助Heroku管理活動數據庫。爲此,打開文件requirements.txt,並添加代碼行psycopg2>=2.6.1 。這將安裝2.6.1版的psycopg2 ——如果有更高的版本,則安裝更高的版本。

如果有必不可少的包在系統中沒有安裝,將其添加到文件requirements.txt中。最終的文件requirements.txt應包含上面列出的每個包。

5、指定Python版本

在活動的虛擬環境中,執行命令python --version:

上面的輸出表明,使用的是Python 3.6.6。在manage.py所在的文件夾中新建一個名爲runtime.txt的文件,並在其中輸入如下內容:

注意 :如果出現錯誤消息,指出不能使用指定的Python版本,訪問https://devcenter.heroku.com/ 並單擊Python,再單擊鏈接Specifying a PythonRuntime。瀏覽打開的文 章,瞭解支持的Python版本,並使用與你使用的Python版本最接近的版本。

6、爲部署到Heroku修改settings.py

在settings.py末尾添加一個片段,在其中指定一些Heroku環境設置:


# Heroku設置
if os.getcwd() == '/app':    # 函數getcwd() ,它獲取當前的工作目錄 (當前運行的文件所在的目錄),在Heroku部署中,這個目錄總是/app
    import dj_database_url
    DATABASES = {
        'default': dj_database_url.config(default='postgres://localhost')
    }
    # 讓request.is_secure()承認X-Forwarded-Proto頭
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
    # 支持所有的主機頭(host header)
    ALLOWED_HOSTS = ['*']
    # 靜態資產配置
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    STATIC_ROOT = 'staticfiles'
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, 'static'),
    )


導入了dj_database_url ,用於在Heroku上配置服務器。Heroku使用PostgreSQL(也叫Postgres)——一種比SQLite更高級的數據庫;這些設置對項目進行配置, 使其在Heroku上使用Postgres數據庫。其他設置的作用分別如下:支持HTTPS請求;讓Django能夠使用Heroku的URL來提供項目提供的服務;設置項目,使其能夠 在Heroku上正確地提供靜態文件。

7、創建啓動進程的Procfile

Procfile告訴Heroku啓動哪些進程,以便能夠正確地提供項目提供的服務。這個文件只包含一行,將其命名爲Procfile(其中的P爲大寫),不指定文件擴展名,並保存到 manage.py所在的目錄中。 Procfile的內容如下:

這行代碼讓Heroku將gunicorn用作服務器,並使用learning_log/wsgi.py中的設置來啓動應用程序。標誌log-file 告訴Heroku應將哪些類型的事件寫入日誌。

8、爲部署到Heroku修改wsgi.py

import os

from django.core.wsgi import get_wsgi_application
from dj_static import Cling

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learning_log.settings')
application = Cling(get_wsgi_application())

導入了幫助正確地提供靜態文件的Cling,並使用它來啓動應用程序。

9、創建用於存儲靜態文件的目錄

在Heroku上,Django蒐集所有的靜態文件,並將它們放在一個地方,以便能夠高效地管理它們。

創建一個用於存儲這些靜態文件的目錄。在文件夾learning_log中,有一個名稱也爲learning_log的子文件夾。在這個子文件夾中,新建一個名爲static的文件夾,因此這個文件夾的路徑爲learning_log/learning_log/static/。還需在這個文件夾中創建一個佔位文件,因爲項目被推送到Heroku時,它將不會包含原來爲空的文件夾。在目錄static/中,創建一個名爲placeholder.txt的文件,並輸入:

This file ensures that learning_log/static/ will be added to the project.

Django will collect static files and place them in learning_log/static/.

是指出了在項目中添加這個文件的原因。

10、在本地使用gunicorn服務器

gunicorn不能在Windows系統上運行。

11、使用Git跟蹤項目文件

Git是一個版本控制程序,能夠在每次成功實現新功能後都拍攝項目代碼的快照。無論出現什麼問題(如實現新功能時不小心引入了bug),都可以輕鬆地恢復到最後一個可行的快照。每個快照都被稱爲提交 。

安裝Git:

HerokuToolbelt包含Git,因此它應該已經安裝到了系統中。然而,在安裝HerokuToolbelt之前打開的終端窗口中無法訪問Git,因此請打開一個新的終端窗口,並在其中執行命 令git --version :

配置git:

Git跟蹤誰修改了項目,即便項目由一個人開發時亦如此。爲進行跟蹤,Git需要知道你的用戶名和email。因此,必須提供用戶名,但對於練習項目,可隨便僞造一個email:

忽略文件:

無需讓Git跟蹤項目中的每個文件,因此將讓Git忽略一些文件。爲此,在manage.py所在的文件夾中創建一個名爲.gitignore的文件。在該目錄下,右鍵選擇Git Bash 進入命令行,進入項目所在目錄。輸入 touch .gitignore ,生成“.gitignore”文件。在這個文件中輸入如下內容:

ll_env/
__pycache__/
*.sqlite3

讓Git忽略目錄ll_env,因爲隨時都可以自動重新創建它。還指定不跟蹤目錄 \ _pycache__,這個目錄包含Django運行.py文件時自動創建的.pyc文件。我們沒有跟蹤對本地數據庫的修改,因爲這是一個糟糕的做法:如果你在服務器上使用的是SQLite,當你將項目推送到服務器時,可能會不小心用本地測試數據庫覆蓋在線數據庫。

提交項目

爲“學習筆記”初始化一個Git倉庫,將所有必要的文件都加入到這個倉庫中,並提交項目的初始狀態,如下所示:

(11_env) D:\Python3項目\learning_log> git init
Initialized empty Git repository in /home/zina/pcc/learning_log/.git/
(11_env) D:\Python3項目\learning_log> git add . 
(11_env) D:\Python3項目\learning_log> git commit -am "Ready for deployment to heroku."
[master (root-commit) dbc1d99] Ready for deployment to heroku.
43 files changed, 746 insertions(+)
create mode 100644 .gitignore
create mode 100644 Procfile
--snipcreate
mode 100644 users/views.py 
(11_env) D:\Python3項目\learning_log> git status
# On branch master
nothing to commit, working directory clean
(11_env) D:\Python3項目\learning_log>

執行命令git init ,在“學習筆記”所在的目錄中初始化一個空倉庫。

執行了命令git add . (千萬別忘了這個句點),它將未被忽略的文件都添 加到這個倉庫中。

執行了命令git commit -am commit message ,其中的標誌-a 讓Git在這個提交中包含所有修改過的文件,而標誌-m 讓Git記錄一條日誌 消息。

執行了命令git status ,輸出表明當前位於分支master中,而工作目錄是乾淨 (clean)的。每當你要將項目推送到Heroku時,都希望看到這樣的狀態。

12、推送到Heroku

在活動的虛擬環境中,執行下面的命令:

 

首先,在終端會話中,使用在https://heroku.com/ 創建賬戶時指定的用戶名和密碼來登錄Heroku。然後,讓Heroku創建一個空項目。Heroku生成的項目名由兩個 單詞和一個數字組成,你以後可修改這個名稱。接下來,我們執行命令git push heroku master (見❸),它讓Git將項目的分支master推送到Heroku剛纔創建的倉庫中; Heroku隨後使用這些文件在其服務器上創建項目。❹處列出了用於訪問這個項目的URL。 執行這些命令後,項目就部署好了,但還未對其做全面的配置。爲覈實正確地啓動了服務器進程,請執行命令heroku ps :

將會打開一網頁,點擊log in,然後可以關閉網頁。打開終端:

繼續輸入命令,讓Heroku創建一個空項目(Heroku生成的項目名由兩個單詞和一個數字組成,以後可修改這個名稱),執行命令git push heroku master ,它讓Git將項目的分支master推送到Heroku剛纔創建的倉庫中; Heroku隨後使用這些文件在其服務器上創建項目:

執行這些命令後,項目就部署好了,但還未對其做全面的配置。爲覈實正確地啓動了服務器進程,請執行命令heroku ps :

輸出指出了項目app一個月可以有550個小時的活躍時間,項目的活動時 間超過這個限制後,將顯示標準的服務器錯誤頁面,稍後我們將設置這個錯誤頁面。

現在,可以使用命令heroku open 在瀏覽器中打開這個應用程序了。

 

看到“學習筆記”的主頁,其樣式設置正確無誤,但還無法使用這個應用程序,因爲沒有建立數據庫。

13、在Heroku上建立數據庫

爲建立在線數據庫,再次執行命令migrate ,並應用在開發期間生成的所有遷移。

要對Heroku項目執行Django和Python命令,可使用命令heroku run 。

Heroku隨後創建一個終端會話來執行命令migrate 。Django應用默認遷移以 及我們在開發“學習筆記”期間生成的遷移。 現在如果訪問這個部署的應用程序,將能夠像在本地系統上一樣使用它。然而,看不到在本地部署中輸入的任何數據,因爲它們沒有複製到在線服務器。

 

在部署過程中遇到的問題:

敲代碼要仔細,報錯了看報錯原因解決問題。如果上傳代碼多次失敗,可刪除在heroku刪除app,重新創建上傳。倉庫指定創建的遠程倉庫。


對該項目進行了一定的改進,訪問鏈接:https://boiling-fortress-84551.herokuapp.com,後續有時間還會更新完善下一些功能。

上一章:Python項目 | Web應用程序之樣式設置

發佈了81 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章