成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python學(xué)習(xí)之路19-設(shè)置應(yīng)用程序的樣式并對(duì)其進(jìn)行部署

陳偉 / 795人閱讀

摘要:刪除的全部代碼,并添加如下代碼第行使用了的一個(gè)自定義模板標(biāo)簽,它讓包含所有的樣式文件。只修改了樣式,并沒有修改代碼。

《Python編程:從入門到實(shí)踐》筆記。
本篇將對(duì)Django項(xiàng)目做最后的完善。本篇也是這本書的最后一篇。
1. 前言

在本篇中,我們將:

使用Bootstrap庫設(shè)置樣式;

把項(xiàng)目部署到Heroku上。

2. 設(shè)置項(xiàng)目“學(xué)習(xí)筆記”的樣式

之前關(guān)注的都是項(xiàng)目的功能,現(xiàn)在來為項(xiàng)目添加樣式。

我們將使用django-bootstrap3來設(shè)置樣式。首先請?jiān)谔摂M環(huán)境中安裝這個(gè)第三方庫。

然后像之前在項(xiàng)目settings.py中注冊我們自己編寫的APP一樣,注冊bootstrap3這個(gè)應(yīng)用程序。

還需要包含django-bootstrap3包含jQuery,在settings.py末尾添加如下代碼:

-- snip --
LOGIN_URL = "/users/login/"

# django-bootstrap3的設(shè)置
BOOTSTRAP3 = {
    "include_jquery": True,
}
2.1 修改base.html 2.1.1 定義HTML頭部

實(shí)現(xiàn)訪問項(xiàng)目的每個(gè)頁面時(shí),瀏覽器標(biāo)題都現(xiàn)實(shí)這個(gè)網(wǎng)站的名稱。另外還添加了一些在模板中使用Bootstrap所需的信息。刪除base.html的全部代碼,并添加如下代碼:

{% load bootstrap3 %}




  
  
  
    
  Learning Log

  {% bootstrap_css %}
  {% bootstrap_javascript %}

第12行使用了django-bootstrap3的一個(gè)自定義模板標(biāo)簽,它讓Django包含所有的Bootstrap樣式文件。第13行啟用可能在頁面中使用的所有交互式行為,如可折疊的導(dǎo)航欄。

2.1.2 定義導(dǎo)航欄
-- snip --





navbar、navbar-defaultnavbar-static-top是三個(gè)選擇器,在nav塊中的內(nèi)容將根據(jù)選擇器在Bootstrap中定義的樣式規(guī)則來設(shè)置樣式(額,html中選擇器的概念有點(diǎn)忘了,不過不要緊,我們的任務(wù)并不是研究HTML)。在第20-28行中是我們之前編寫的判斷語句,只不過被放在了ul塊中,并且設(shè)置了一個(gè)選擇器navbar-right。

2.1.3 定義頁面的主要部分
-- snip --


-- snip --
{% block content %}{% endblock %}

這部分包含一個(gè)div塊,該塊的class屬性是container(容器),容器中包含兩個(gè)元素:一個(gè)新增的header塊和之前用到的content塊。header塊的內(nèi)容告訴用戶頁面包含哪些信息以及用戶可以在頁面上執(zhí)行哪些操作,其class屬性值page-header將一系列樣式應(yīng)用于這個(gè)塊。base.html的修改到此為止。

2.2 使用jumbotron設(shè)置主頁樣式

下面使用新定義的header塊及另一個(gè)名為jumbotron的Bootstrap元素修改主頁。jumbotron元素是一個(gè)大框,通常用于在主頁中呈現(xiàn)項(xiàng)目的簡要描述,修改index.html

{% extends "learning_logs/base.html" %}

{% block header %}
  

Track your learning.

{% endblock header %} {% block content %}

Register an accountto make your own Learning Log, and list the topics you"re learning about.

Whenever you learn something new about a topic, make an entry summarizing what you"ve learned.

{% endblock content %}

header塊中,我們用一個(gè)jumbotron元素來修飾一條簡短的標(biāo)語,讓首次訪問者大致知道網(wǎng)站功能。隨后再content塊中描述了兩種主要操作。下圖是實(shí)際效果:

2.3 設(shè)置登錄頁面樣式

現(xiàn)在的代碼改進(jìn)了登錄頁面的整體外觀(因?yàn)樾薷牧?b>base.html),現(xiàn)在來改進(jìn)登錄表單,修改login.html

{% extends "learning_logs/base.html" %}
{% load bootstrap3 %}

{% block header %}
  

Log in to your account.

{% endblock header %} {% block content %}
{% csrf_token %} {% bootstrap_form form %} {% buttons %} {% endbuttons %}
{% endblock content %}

第2行代碼加載了bootstrap3模板標(biāo)簽;

header塊描述這個(gè)頁面時(shí)做什么的;

刪除了之前的 if form.errors代碼塊,因?yàn)?b>django-bootstrap3位自動(dòng)管理表單錯(cuò)誤;

form塊中添加了屬性“form",然后使用標(biāo)簽?zāi)0?b>bootstrap_form來顯示表單,這個(gè)標(biāo)簽替換掉了之前的form.as_p;

button也使用Bootstrap樣式進(jìn)行了替換,下面是實(shí)際效果圖:

2.4 設(shè)置new_topic.html頁面樣式
{% extends "learning_logs/base.html" %}
{% load bootstrap3 %}

{% block header %}
  

Add a new topic:

{% endblock header %} {% block content %}
{% csrf_token %} {% bootstrap_form %} {% buttons %} {% endbuttons %}
{% endblock content %}

上面的修改大多都類似于對(duì)login.html的修改。

2.5 設(shè)置topics.html頁面樣式
{% extends "learning_logs/base.html" %}

{% block header %}
  

Topics

{% endblock header %} {% block content %}
    {% for topic in topics %}
  • {{ topic }}

  • {% empty %}
  • No topics have been added yet.
  • {% endfor %}

Add a new topic:

{% endblock content %}

這里并沒有加載bootstrap3,因?yàn)樵撐募胁]有使用任何bootstrap3自定義標(biāo)簽。

2.6 設(shè)置topic.html中條目的樣式

topic頁面包含的內(nèi)容比其他大部分頁面都多,所以樣式設(shè)置要多一些,我們將使用Bootstrap面板(panel)來突出每個(gè)條目。

{% extends "learning_logs/base.html" %}

{% block header %}
  

{{ topic }}

{% endblock header %} {% block content %}

add new entry

{% for entry in entries %}

{{ entry.date_added|date:"M d, Y H:i" }} edit entry

{{ entry.text|linebreaks }}
{% empty %}
  • There are no entries for this topic yet.
  • {% endfor %} {% endblock content %}

    只修改了樣式,并沒有修改Django代碼。下圖是實(shí)際效果:

    至此已完成了對(duì)頁面的修改。

    3. 部署“學(xué)習(xí)筆記”

    由于對(duì)Web應(yīng)用不是很了解,筆者查閱資料現(xiàn)在大多用Apache和Nginx來部署Web項(xiàng)目,但本書使用Heroku來部署我們的Web項(xiàng)目。

    請到Heroku的官網(wǎng)注冊賬號(hào),它提供免費(fèi)使用服務(wù),并到https://toolbelt.heroku.com/ 下載命令行工具。

    同時(shí),還需要在Django項(xiàng)目所在的虛擬環(huán)境中安裝一些額外的包:

    dj-database-url:幫助Django與Heroku使用的數(shù)據(jù)庫進(jìn)行通信;

    dj-static,static3:幫助Django正確管理靜態(tài)文件(靜態(tài)文件包括樣式規(guī)則和JavaScript文件);

    gunicorn:一個(gè)服務(wù)器軟件,能夠在在線環(huán)境中支持應(yīng)用程序提供的服務(wù)。

    3.1 創(chuàng)建包含包列表的文件requirements.txt

    Heroku需要知道我們的項(xiàng)目依賴于哪些包,使用pip命令來生成這個(gè)文件:

    (venv)learning_log>pip freeze > requirements.txt

    下面是這個(gè)文件所包含的內(nèi)容(“如果是Windows系統(tǒng),看到的內(nèi)容可能不全”——這是書中提示,然而這里的內(nèi)容還比書中多了一個(gè)pytz):

    dj-database-url==0.5.0
    dj-static==0.0.6
    Django==2.0.4
    django-bootstrap3==9.1.0
    gunicorn==19.7.1
    pytz==2018.4
    static3==0.7.0

    在部署項(xiàng)目時(shí),Heroku將創(chuàng)建一個(gè)環(huán)境,并根據(jù)這個(gè)文件安裝其中的所有包。也因此,項(xiàng)目部署到Heroku后,行為將與它在本地系統(tǒng)上一樣。

    還需要在包列表中添加psycopg2,它幫助Heroku管理活動(dòng)數(shù)據(jù)庫。需在requirements.txt最后一行添加如下代碼:psycopg2>=2.6.1。該語句表示,有新版則裝最新版,沒有的話最低安裝2.6.1版本。

    3.2 確定Python版本

    如果沒有指定Python版本,Heroku將使用其當(dāng)前的Python默認(rèn)版本。下面來確保Heroku使用我們所使用的版本。如果不知道使用的python的版本,請?jiān)陧?xiàng)目所在虛擬環(huán)境中執(zhí)行python --version

    (venv)learning_log>python --version
    Python 3.6.4

    再在manage.py所在的文件夾中新建一個(gè)名為runtime.txt的文件,輸入Python的版本:

    python-3.6.4

    注意:單詞小寫,中間有一個(gè)連字符!

    3.3 為部署到Heroku而修改settings.py

    settings.py末尾添加一個(gè)片段,指定一些Heroku環(huán)境設(shè)置:

    -- snip --
    # 書中的判斷語句是 if os.getcwd() == "/app": 
    # 現(xiàn)在估計(jì)是Heroku升級(jí)了,改為了下面的語句,否則待會(huì)兒部署的時(shí)候會(huì)出錯(cuò)
    if os.environ["HOME"] == "/app":
        import dj_database_url
    
        DATABASES = {
            "default": dj_database_url.config(default="postgres://localhost")
        }
    
        # 讓request.is_secure()承認(rèn)X-Forwarded-Proto頭
        SECURE_PROXY_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
    
        # 支持所有的主機(jī)頭(host header)
        ALLOWED_HOSTS = ["*"]
    
        # 靜態(tài)資產(chǎn)配置
        BASE_DIR = os.path.dirname(os.path.abspath(__file__))
        # 書中設(shè)置是這樣的: STATIC_ROOT = "staticfiles"
        STATIC_ROOT = os.path.join(BASE_DIR, "static")
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, "static"),
        )

    第2行中,使用getcwd()函數(shù)獲取當(dāng)前的工作目錄,在Heroku中,這個(gè)目錄總/app。在本地部署中,這個(gè)目錄通常是項(xiàng)目文件的名稱。這個(gè)if測試確保僅當(dāng)項(xiàng)目被部署到Heroku時(shí)才運(yùn)行這個(gè)代碼塊。這種結(jié)構(gòu)讓我們能夠?qū)⒔y(tǒng)一配置文件用于本地開發(fā)環(huán)境和在線服務(wù)器。

    在第3行,導(dǎo)入了dj_database_url,用于在Heroku上配置服務(wù)器。Heroku使用PostgreSQL(也叫Postgres,一種比SQLite更高級(jí)的數(shù)據(jù)庫),這些配置使得項(xiàng)目在Heroku上使用該數(shù)據(jù)庫。

    其他配置作用分別如下:支持HTTPS請求(第10行);讓Django能夠使用Heroku的URL來提供項(xiàng)目支持的服務(wù)(第13行);設(shè)置項(xiàng)目,使其能夠在Heroku上正確地提供靜態(tài)文件(第16-20行)。

    3.4 創(chuàng)建啟動(dòng)進(jìn)程的Procfile

    Procfile告訴Heroku啟動(dòng)那些進(jìn)程,以便能夠正確地提供項(xiàng)目支持的服務(wù)。這個(gè)文件只包含一行,文件名為Procfile,不帶擴(kuò)展名,保存到項(xiàng)目根目錄。

    web: gunicorn learning_log.wsgi --log-file -

    這段代碼讓Heroku將gunicorn用過服務(wù)器,并使用learning_log/wsgi.py中的設(shè)置來啟動(dòng)應(yīng)用程序。標(biāo)志log-file告訴Heroku應(yīng)將哪些類型的時(shí)間寫入日志。

    3.5 為部署到Heroku而修改wsgi.py

    因?yàn)镠eroku需要的設(shè)置與目前一直使用的設(shè)置稍有不同,所以還需要修改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 = get_wsgi_application()
    application = Cling(get_wsgi_application())

    注意,這里只有第4,9行是添加的,其余都是自帶的。

    3.6 創(chuàng)建用于存儲(chǔ)靜態(tài)文件的目錄

    在Heroku上,Django搜集所有的靜態(tài)文件,并將它們放在一個(gè)地方,以便高效管理。我們需要手動(dòng)創(chuàng)建這樣一個(gè)文件夾。在項(xiàng)目文件夾learning_log中,也有一個(gè)名為learning_log的子文件夾,在這個(gè)子文件夾中,新建一個(gè)名為static的文件夾,即這個(gè)文件夾的路徑為:learning_log/learning_log/static/。由于項(xiàng)目被推送到Heroku時(shí),它將不包含空文件夾,所以,在static文件夾中還需要?jiǎng)?chuàng)建一個(gè)占位文件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/.
    3.7 在本地使用gunicorn服務(wù)器

    如果你使用的是Linux或OS X,可在部署到Heroku前嘗試在本地使用gunicorn服務(wù)器。為此,在虛擬環(huán)境中執(zhí)行命令:

    (ll_env)learning_log$ heroku local
    Installing Heroku Toolbelt v4... done
    -- snip --
    forego | starting web.1 on port 5000
    web.1 | [2018-04-27 14:00:00 -0800] [12875] [INFO] Starting gunicorn 19.3.0
    -- snip --

    但如果使用的是Windows,請?zhí)^這個(gè)步驟(筆者用的是Windows,所以上面的輸出是從書上照搬過來的)。

    3.8 使用Git跟蹤項(xiàng)目文件

    Heroku Toolbelt包含Git,這里不再介紹Git怎么安裝。

    Git跟蹤誰修改了項(xiàng)目,即便項(xiàng)目由一個(gè)人開發(fā)。為了實(shí)現(xiàn)跟蹤,需要提供用戶名和email,但對(duì)于聯(lián)系項(xiàng)目,這倆都可以隨便起:

    (ll_env)learning_log$ git config --global user.name "example"
    (ll_env)learning_log$ git config --global user.email "[email protected]"

    我們無需讓Git跟蹤項(xiàng)目中的每個(gè)文件,因此將讓Git忽略一些文件。在項(xiàng)目根目錄下創(chuàng)建一個(gè)名為 .gitignore 的文件,注意前面有一個(gè)實(shí)心句點(diǎn),不含擴(kuò)展名。在文件中輸入:

    ll_env/
    __pycache__/
    *.sqlite3

    忽略ll_env目錄是因?yàn)殡S時(shí)都可以重新創(chuàng)建它;忽略__pycache__是因?yàn)檫@個(gè)目錄包含了Django運(yùn)行.py文件時(shí)自動(dòng)創(chuàng)建的.pyc文件,目前都是本地?cái)?shù)據(jù)(如果使用的是python2.7,請將__pycache__替換為*.pyc);沒有跟蹤本地?cái)?shù)據(jù)庫是因?yàn)槿绻阍诜?wù)器上使用的是SQLite,當(dāng)你將項(xiàng)目推送到服務(wù)器時(shí),可能會(huì)不小心把服務(wù)器上的數(shù)據(jù)給覆蓋掉。

    最后,我們提交項(xiàng)目,而在提交之前需要為我們的項(xiàng)目初始化一個(gè)Git倉庫,將所有必要的文件都加入到這個(gè)倉庫中,并提交項(xiàng)目的初始狀態(tài),如下:

    (ll_env) learning_log>git init
    Initialized empty Git repository in E:/Code/Python/learning_log/.git/
    
    (ll_env) learning_log>git add .
    
    (ll_env) learning_log>git commit -am "Ready for deployment to heroku."
    [master (root-commit) 4109cbc] Ready for deployment to heroku.
     39 files changed, 745 insertions(+)
     create mode 100644 .gitignore
     -- snip --
     create mode 100644 users/views.py
    
    (ll_env) learning_log>git status
    On branch master
    nothing to commit, working tree clean

    第一個(gè)命令在“學(xué)習(xí)筆記”所在的目錄中初始化一個(gè)空倉庫;第二個(gè)命令(最后有個(gè)句點(diǎn)?。⑽幢缓雎缘奈募继砑拥竭@個(gè)倉庫中;第三個(gè)命令中的標(biāo)志 -a 讓Git在這個(gè)提交中包含所有修改過的文件,而標(biāo)志 -m 讓Git記錄一條日志消息;第四個(gè)命令的輸出表明當(dāng)前位于分支master中,而工作目錄是干凈(clean)的,每當(dāng)要將項(xiàng)目推送到Heroku時(shí),都希望看到這個(gè)狀態(tài)。

    3.9 推送到Heroku

    現(xiàn)在開始推送項(xiàng)目。在項(xiàng)目的虛擬環(huán)境中執(zhí)行下面的命令:

    (ll_env) learning_log>heroku login
    Enter your Heroku credentials:
    Email: [email protected]
    Password: ************
    Logged in as [email protected]
    
    (ll_env) learning_log>heroku create
    Creating app... done, ? pure-anchorage-27981
    https://pure-anchorage-27981.herokuapp.com/ | https://git.heroku.com/pure-anchorage-27981.git
    
    (ll_env) learning_log>git push heroku master
    Counting objects: 46, done.
    -- snip --
    remote: Verifying deploy... done.
    To https://git.heroku.com/pure-anchorage-27981.git
     * [new branch]      master -> master

    首先,在終端會(huì)話中,使用你在Heroku官網(wǎng)創(chuàng)建的賬號(hào)登陸,然后讓Heroku創(chuàng)建一個(gè)空項(xiàng)目。Heroku生成的項(xiàng)目名由兩個(gè)單詞和一個(gè)數(shù)字組成(可以修改)。然后我們讓Git將項(xiàng)目分值master推送到Heroku剛才建立的倉庫中;Heroku隨后使用這些文件在其服務(wù)器上創(chuàng)建項(xiàng)目。最后輸出信息還給出了訪問這個(gè)項(xiàng)目的URL。

    大概上述命令執(zhí)行完后,項(xiàng)目便部署好了,但還未對(duì)其做全面的配置。為核實(shí)正確地啟動(dòng)了服務(wù)器進(jìn)程,請執(zhí)行命令heroku ps

    (ll_env) learning_log>heroku ps
    Free dyno hours quota remaining this month: 550h 0m (100%)
    For more information on dyno sleeping and how to upgrade, see:
    https://devcenter.heroku.com/articles/dyno-sleeping
    
    === web (Free): gunicorn learning_log.wsgi --log-file - (1)
    web.1: up 2018/04/27 16:36:42 +0800 (~ 6m ago)

    當(dāng)執(zhí)行了這條命令后,輸出指出項(xiàng)目還可在多長時(shí)間內(nèi)處于活動(dòng)狀態(tài)。當(dāng)超過這個(gè)時(shí)間后,將顯示標(biāo)準(zhǔn)的服務(wù)器錯(cuò)誤頁面,而稍后我們將設(shè)置這個(gè)錯(cuò)誤頁面。在倒數(shù)第二行,我們發(fā)現(xiàn)啟動(dòng)了Procfile指定的進(jìn)程。

    現(xiàn)在,我們可以使用命令heroku open在瀏覽器中打開這個(gè)APP了:

    (ll_env) learning_log>heroku open

    它將自動(dòng)打開瀏覽器,顯示項(xiàng)目的主頁。

    3.10 在Heroku上建立數(shù)據(jù)庫

    要對(duì)Heroku項(xiàng)目執(zhí)行Django和Python命令,可使用命令heroku run

    (ll_env) learning_log>heroku run python manage.py migrate
    Running python manage.py migrate on ? pure-anchorage-27981... up, run.9204 (Free)
    -- snip --
    Operations to perform:
      Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
    Running migrations:
      -- snip --
      Applying learning_logs.0003_topic_owner... OK
      Applying sessions.0001_initial... OK

    當(dāng)執(zhí)行上述命令后,Heroku創(chuàng)建一個(gè)終端會(huì)話來執(zhí)行命令migrate(第2行)。從第6行起,Django應(yīng)用默認(rèn)遷移以及我們在開發(fā)“學(xué)習(xí)筆記”期間生成的遷移。

    現(xiàn)在可以像在本地系統(tǒng)上一樣使用它。然而其中并沒有任何數(shù)據(jù),因?yàn)橹暗臏y試數(shù)據(jù)并沒有復(fù)制到服務(wù)器中,而且也不建議將測試數(shù)據(jù)復(fù)制到服務(wù)器中。

    3.11 改進(jìn)Heroku部署 3.11.1 在Heroku上創(chuàng)建超級(jí)用戶

    從上面的命令可以看出,我們可以使用heroku run來執(zhí)行一次性命令,但可以這樣執(zhí)行命令:在連接到了Heroku服務(wù)器的情況下,使用命令heroku run bash來打開Bash終端會(huì)話。我們將使用Bash終端會(huì)話來創(chuàng)建超級(jí)用戶,以便能夠訪問在線應(yīng)用程序的管理網(wǎng)站:

    (ll_env) learning_log>heroku run bash
    Running bash on ? pure-anchorage-27981... up, run.8093 (Free)
    ~ $ ls
    learning_log  learning_logs  manage.py  Procfile  requirements.txt  runtime.txt  users
    ~ $ python manage.py createsuperuser
    /app/.heroku/python/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning:
    The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing
    from binary please use "pip install psycopg2-binary" instead. For details see: 
    .
      """)
    Username (leave blank to use "u10229"): ll_admin
    Email address:
    Password:
    Password (again):
    Superuser created successfully.
    ~ $ exit
    exit
    (venv) learning_log>

    進(jìn)入Bash后,我們首先執(zhí)行了ls命令,以查看服務(wù)器上有哪些文件和目錄,發(fā)現(xiàn)和本地系統(tǒng)相同。然后我們執(zhí)行了常見超級(jí)用戶的命令,執(zhí)行過程和之前創(chuàng)建超級(jí)用戶一樣?,F(xiàn)在可以通過在APP的URL后面加/admin/來登陸管理網(wǎng)站了。

    3.11.2 在Heroku上創(chuàng)建對(duì)用戶友好的URL

    由于在服務(wù)器上我們的項(xiàng)目名不是learning_log,而是其他自動(dòng)生成的名字,為此,我們使用一個(gè)命令來重命名這個(gè)APP:

    (ll_env) learning_log>heroku apps:rename kevins-learning-log
    Renaming pure-anchorage-27981 to kevins-learning-log... done
    https://kevins-learning-log.herokuapp.com/ | https://git.heroku.com/kevins-learning-log.git
    Git remote heroku updated
     !    Don"t forget to update git remotes for all other local checkouts of the app.
    3.12 確保項(xiàng)目的安全

    當(dāng)前這個(gè)項(xiàng)目存在一個(gè)嚴(yán)重的安全問題:settings.py中包含設(shè)置DEBUG=True,它在發(fā)生錯(cuò)誤時(shí)顯示調(diào)試信息。開發(fā)項(xiàng)目時(shí),Django的錯(cuò)誤頁面向你顯示了重要的調(diào)試信息,如果將項(xiàng)目部署到服務(wù)器后依然保留這個(gè)設(shè)置,講給攻擊者提供大量可供利用的信息。我們還需要確保任何人都無法看到這些信息,也不能冒充項(xiàng)目托管網(wǎng)站來重定向請求。

    下面修改settings.py文件,以讓我們能夠在本地看到錯(cuò)誤信息,但部署到服務(wù)器后不顯示任何錯(cuò)誤信息:

    -- snip --
    if os.environ["HOME"] == "/app":
        -- snip --
        # 只允許Heroku托管這個(gè)項(xiàng)目
        ALLOWED_HOSTS = ["kevins-learning-log.herokuapp.com"]
        
        DEBUG = False
        -- snip --

    然后我們提交并推送修改。先將修改提交到Git倉庫,在推送到Heroku:

    (venv) E:CodePythonlearning_log>git commit -am "Set DEBUG=False for heroku."
    [master 563b175] Set DEBUG=False for heroku.
     1 file changed, 6 insertions(+), 4 deletions(-)
    
    (venv) E:CodePythonlearning_log>git status
    On branch master
    nothing to commit, working tree clean
    
    (venv) E:CodePythonlearning_log>git push heroku master
    -- snip --
    remote: -----> Python app detected
    remote: -----> Installing requirements with pip
    -- snip --
    remote: -----> Launching...
    remote:        Released v7
    remote:        https://kevins-learning-log.herokuapp.com/ deployed to Heroku
    remote:
    remote: Verifying deploy... done.
    To https://git.heroku.com/kevins-learning-log.git
       9bc1c2d..563b175  master -> master
    

    Heroku發(fā)現(xiàn)倉庫發(fā)生了變化,因此重建了項(xiàng)目,確保所有的修改都已生效。它不會(huì)重建數(shù)據(jù)庫,因此本次無需執(zhí)行命令migrate

    現(xiàn)在如果訪問未定義的擴(kuò)展將會(huì)看到一個(gè)標(biāo)準(zhǔn)的錯(cuò)誤頁面,它不包含任何關(guān)于項(xiàng)目的具體信息。

    3.13 創(chuàng)建自定義錯(cuò)誤頁面

    編寫兩個(gè)風(fēng)格與我們項(xiàng)目相符的404和500錯(cuò)誤頁面模板。這些模板必須放在根模板目錄中。為此,在文件夾leraning_log/learning_log中新建一個(gè)文件夾templates,再在這個(gè)文件夾中新建一個(gè)404.html文件,并輸入如下內(nèi)容:

    {% extends "learning_logs/base.html" %}
    
    {% block header %}
      

    The item you requested is not available.(404)

    {% endblock header %}

    再創(chuàng)建一個(gè)名為500.html的文件:

    {% extends "learning_logs/base.html" %}
    
    {% block header %}
      

    There has been an internal error. (500)

    {% endblock header %}

    這些新文件要求對(duì)settings.py做細(xì)微的修改:

    -- snip --
    TEMPLATES = [
        {
            "BACKEND": "django.template.backends.django.DjangoTemplates",
            "DIRS": [os.path.join(BASE_DIR, "learning_log/templates")],
            "APP_DIRS": True,
            -- snip --
        },
    ]
    -- snip --

    在將修改推送到服務(wù)器之前,可以在本地查看錯(cuò)誤頁面時(shí)什么樣的,不過得先在本地設(shè)置DEBUG=False

    # settings.py文件
    # SECURITY WARNING: don"t run with debug turned on in production!
    DEBUG = False
    
    ALLOWED_HOSTS = ["localhost"]

    現(xiàn)在本地訪問不存在的頁面時(shí)將得到我們自定義的錯(cuò)誤頁面。

    最后,想之前一樣,將修改推送到服務(wù)器,代碼不再演示,注意為推送添加一條簡短的日志信息。

    現(xiàn)在,如果用戶手工請求不存在的主題或條目將導(dǎo)致500錯(cuò)誤。Django嘗試渲染請求的頁面,但沒有足夠的信息來完成這項(xiàng)任務(wù),進(jìn)而引發(fā)500錯(cuò)誤。對(duì)于這種情況,將其視為404錯(cuò)誤更合適,為此可使用Django快捷函數(shù)get_object_or_404()。這個(gè)函數(shù)嘗試從數(shù)據(jù)庫獲取請求的對(duì)象,當(dāng)對(duì)象不存在時(shí),引發(fā)404錯(cuò)誤。我們在views.py中導(dǎo)入這個(gè)函數(shù),并用它替換函數(shù)get()

    from django.shortcuts import render, get_object_or_404
    @login_required
    def topic(request, topic_id):
        """顯示單個(gè)主題及其所有的條目"""
        topic = get_object_or_404(Topic, id=topic_id)
        -- snip --

    再次提交并推送修改。

    3.14 部署總結(jié)

    從前面這些例子可看出,開發(fā)與部署的過程如下:

    ①修改項(xiàng)目。如果創(chuàng)建了新文件,使用命令 git add. (最后有個(gè)句點(diǎn)!)將它們加到Git倉庫中。如果要遷移數(shù)據(jù)庫,也需要執(zhí)行該命令,因?yàn)槊總€(gè)遷移都生成了新的遷移文件。

    ②執(zhí)行 git commit -am "commit message",將修改提交到倉庫。

    ③執(zhí)行 git push heroku master 將修改推送到服務(wù)器。

    ④如果本地遷移了數(shù)據(jù)庫,也需要遷移在線數(shù)據(jù)庫,可以使用一次性命令 heroku run python manage.py migrate ,也可以使用 heroku run bash打開一個(gè)遠(yuǎn)程終端會(huì)話,再執(zhí)行遷移。

    3.15 設(shè)置SECRET_KEY

    Django根據(jù)settings.py中的SECRET_KEY來實(shí)現(xiàn)大量的安全協(xié)議。本項(xiàng)目中設(shè)置的SECRET_KEY對(duì)一個(gè)練習(xí)項(xiàng)目來說已經(jīng)足夠了,但是對(duì)于生產(chǎn)網(wǎng)站,請務(wù)必認(rèn)真對(duì)待這個(gè)值。

    3.16 將項(xiàng)目從Heroku刪除

    Heroku限制了你可免費(fèi)托管的項(xiàng)目數(shù),另外,我們也不希望自己的賬戶中塞滿大量的聯(lián)系項(xiàng)目。除了可以登錄到Heroku,在應(yīng)用程序的Settings中手動(dòng)刪除項(xiàng)目,也可以在命令行中執(zhí)行如下命令刪除項(xiàng)目:

    (ll_env)learning_log$ heroku apps:destroy --app appname
    4. 總結(jié)

    現(xiàn)在大家可以訪問這個(gè)網(wǎng)站 https://kevins-learning-log.h... (筆者在免費(fèi)期過期前不會(huì)刪除這個(gè)網(wǎng)站)。本篇主要介紹了如何使用Bootstrap來設(shè)置網(wǎng)頁的樣式,并學(xué)習(xí)了如何將項(xiàng)目部署到Heroku的服務(wù)器上。至此,Python的Django入門已經(jīng)完成,這本書也已經(jīng)看完。暫時(shí)告一段落。


    迎大家關(guān)注我的微信公眾號(hào)"代碼港" & 個(gè)人網(wǎng)站 www.vpointer.net ~

    文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44720.html

    相關(guān)文章

    • 如何創(chuàng)建一個(gè)數(shù)據(jù)科學(xué)項(xiàng)目?

      摘要:雖然我們可以在網(wǎng)上參照各種模板項(xiàng)目文章博客等創(chuàng)建一個(gè)數(shù)據(jù)科學(xué)項(xiàng)目,但是目前也沒有教科書對(duì)這些知識(shí)做一個(gè)統(tǒng)一的回答。舉個(gè)例子來說,數(shù)據(jù)科學(xué)分析項(xiàng)目通常就不需要部署和監(jiān)控這兩個(gè)過程。創(chuàng)建文件描述源數(shù)據(jù)及位置。進(jìn)一步探索和報(bào)告在整個(gè)數(shù)據(jù)科學(xué)項(xiàng)目中 摘要:?在一個(gè)新的數(shù)據(jù)科學(xué)項(xiàng)目,你應(yīng)該如何組織你的項(xiàng)目流程?數(shù)據(jù)和代碼要放在那里?應(yīng)該使用什么工具?在對(duì)數(shù)據(jù)處理之前,需要考慮哪些方面?讀完本文...

      Aceyclee 評(píng)論0 收藏0
    • Python學(xué)習(xí)之路15-下載數(shù)據(jù)

      摘要:本節(jié)中將繪制幅圖像收盤折線圖,收盤價(jià)對(duì)數(shù)變換,收盤價(jià)月日均值,收盤價(jià)周日均值,收盤價(jià)星期均值。對(duì)數(shù)變換是常用的處理方法之一。 《Python編程:從入門到實(shí)踐》筆記。本篇是Python數(shù)據(jù)處理的第二篇,本篇將使用網(wǎng)上下載的數(shù)據(jù),對(duì)這些數(shù)據(jù)進(jìn)行可視化。 1. 前言 本篇將訪問并可視化以兩種常見格式存儲(chǔ)的數(shù)據(jù):CSV和JSON: 使用Python的csv模塊來處理以CSV(逗號(hào)分隔的值)...

      張春雷 評(píng)論0 收藏0
    • Kubernetes之路 2 - 利用LXCFS提升容器資源可見性

      摘要:簡介社區(qū)中常見的做法是利用來提供容器中的資源可見性。從而使得應(yīng)用獲得正確的資源約束設(shè)定。阿里云服務(wù)全球首批通過一致性認(rèn)證,簡化了集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡化的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價(jià)值創(chuàng)新。 摘要: 這是本系列的第2篇內(nèi)容,將介紹在Docker和Kubernetes環(huán)境中解決遺留應(yīng)用無法識(shí)別容器資源限制的問題。 showImg(https://se...

      graf 評(píng)論0 收藏0
    • 從docker到istio之二 - 使用compose部署應(yīng)用

      摘要:使用導(dǎo)出端口,使用掛載數(shù)據(jù)卷。清理應(yīng)用使用一鍵清理應(yīng)用總結(jié)已經(jīng)實(shí)現(xiàn)了容器擴(kuò)容自動(dòng)擋更直觀的控制容器啟動(dòng)順序及依賴。從部署到編排,單字面理解,看起來能夠維護(hù)的容器量都增長了。推薦應(yīng)用包括多個(gè)服務(wù),推薦部署方式就是。前言 容器化,云原生越演越烈,新概念非常之多。信息爆炸的同時(shí),帶來層層迷霧。我嘗試從擴(kuò)容出發(fā)理解其脈路,經(jīng)過實(shí)踐探索,整理形成一個(gè)入門教程,包括下面四篇文章。 容器化實(shí)踐之路-從d...

      yy13818512006 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    閱讀需要支付1元查看
    <