亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

陳偉 / 864人閱讀

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

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

在本篇中,我們將:

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

把項目部署到Heroku上。

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

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

我們將使用django-bootstrap3來設(shè)置樣式。首先請在虛擬環(huán)境中安裝這個第三方庫。

然后像之前在項目settings.py中注冊我們自己編寫的APP一樣,注冊bootstrap3這個應(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頭部

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

{% load bootstrap3 %}




  
  
  
    
  Learning Log

  {% bootstrap_css %}
  {% bootstrap_javascript %}

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

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





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

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


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

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

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

下面使用新定義的header塊及另一個名為jumbotron的Bootstrap元素修改主頁。jumbotron元素是一個大框,通常用于在主頁中呈現(xiàn)項目的簡要描述,修改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塊中,我們用一個jumbotron元素來修飾一條簡短的標(biāo)語,讓首次訪問者大致知道網(wǎng)站功能。隨后再content塊中描述了兩種主要操作。下圖是實際效果:

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

現(xiàn)在的代碼改進(jìn)了登錄頁面的整體外觀(因為修改了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塊描述這個頁面時做什么的;

刪除了之前的 if form.errors代碼塊,因為django-bootstrap3位自動管理表單錯誤;

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

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

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 %}

上面的修改大多都類似于對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,因為該文件中并沒有使用任何bootstrap3自定義標(biāo)簽。

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

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

{% 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代碼。下圖是實際效果:

    至此已完成了對頁面的修改。

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

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

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

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

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

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

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

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

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

    (venv)learning_log>pip freeze > requirements.txt

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

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

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

    3.2 確定Python版本

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

    (venv)learning_log>python --version
    Python 3.6.4

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

    python-3.6.4

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

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

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

    -- snip --
    # 書中的判斷語句是 if os.getcwd() == "/app": 
    # 現(xiàn)在估計是Heroku升級了,改為了下面的語句,否則待會兒部署的時候會出錯
    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中,這個目錄總/app。在本地部署中,這個目錄通常是項目文件的名稱。這個if測試確保僅當(dāng)項目被部署到Heroku時才運行這個代碼塊。這種結(jié)構(gòu)讓我們能夠?qū)⒔y(tǒng)一配置文件用于本地開發(fā)環(huán)境和在線服務(wù)器。

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

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

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

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

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

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

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

    因為Heroku需要的設(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)建用于存儲靜態(tài)文件的目錄

    在Heroku上,Django搜集所有的靜態(tài)文件,并將它們放在一個地方,以便高效管理。我們需要手動創(chuàng)建這樣一個文件夾。在項目文件夾learning_log中,也有一個名為learning_log的子文件夾,在這個子文件夾中,新建一個名為static的文件夾,即這個文件夾的路徑為:learning_log/learning_log/static/。由于項目被推送到Heroku時,它將不包含空文件夾,所以,在static文件夾中還需要創(chuàng)建一個占位文件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í)^這個步驟(筆者用的是Windows,所以上面的輸出是從書上照搬過來的)。

    3.8 使用Git跟蹤項目文件

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

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

    (ll_env)learning_log$ git config --global user.name "example"
    (ll_env)learning_log$ git config --global user.email "test@example.com"

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

    ll_env/
    __pycache__/
    *.sqlite3

    忽略ll_env目錄是因為隨時都可以重新創(chuàng)建它;忽略__pycache__是因為這個目錄包含了Django運行.py文件時自動創(chuàng)建的.pyc文件,目前都是本地數(shù)據(jù)(如果使用的是python2.7,請將__pycache__替換為*.pyc);沒有跟蹤本地數(shù)據(jù)庫是因為如果你在服務(wù)器上使用的是SQLite,當(dāng)你將項目推送到服務(wù)器時,可能會不小心把服務(wù)器上的數(shù)據(jù)給覆蓋掉。

    最后,我們提交項目,而在提交之前需要為我們的項目初始化一個Git倉庫,將所有必要的文件都加入到這個倉庫中,并提交項目的初始狀態(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

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

    3.9 推送到Heroku

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

    (ll_env) learning_log>heroku login
    Enter your Heroku credentials:
    Email: kevinwen701@gmail.com
    Password: ************
    Logged in as kevinwen701@gmail.com
    
    (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

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

    大概上述命令執(zhí)行完后,項目便部署好了,但還未對其做全面的配置。為核實正確地啟動了服務(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í)行了這條命令后,輸出指出項目還可在多長時間內(nèi)處于活動狀態(tài)。當(dāng)超過這個時間后,將顯示標(biāo)準(zhǔn)的服務(wù)器錯誤頁面,而稍后我們將設(shè)置這個錯誤頁面。在倒數(shù)第二行,我們發(fā)現(xiàn)啟動了Procfile指定的進(jìn)程。

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

    (ll_env) learning_log>heroku open

    它將自動打開瀏覽器,顯示項目的主頁。

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

    要對Heroku項目執(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)建一個終端會話來執(zhí)行命令migrate(第2行)。從第6行起,Django應(yīng)用默認(rèn)遷移以及我們在開發(fā)“學(xué)習(xí)筆記”期間生成的遷移。

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

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

    從上面的命令可以看出,我們可以使用heroku run來執(zhí)行一次性命令,但可以這樣執(zhí)行命令:在連接到了Heroku服務(wù)器的情況下,使用命令heroku run bash來打開Bash終端會話。我們將使用Bash終端會話來創(chuàng)建超級用戶,以便能夠訪問在線應(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í)行了常見超級用戶的命令,執(zhí)行過程和之前創(chuàng)建超級用戶一樣?,F(xiàn)在可以通過在APP的URL后面加/admin/來登陸管理網(wǎng)站了。

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

    由于在服務(wù)器上我們的項目名不是learning_log,而是其他自動生成的名字,為此,我們使用一個命令來重命名這個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 確保項目的安全

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

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

    -- snip --
    if os.environ["HOME"] == "/app":
        -- snip --
        # 只允許Heroku托管這個項目
        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ā)生了變化,因此重建了項目,確保所有的修改都已生效。它不會重建數(shù)據(jù)庫,因此本次無需執(zhí)行命令migrate。

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

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

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

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

    The item you requested is not available.(404)

    {% endblock header %}

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

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

    There has been an internal error. (500)

    {% endblock header %}

    這些新文件要求對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ù)器之前,可以在本地查看錯誤頁面時什么樣的,不過得先在本地設(shè)置DEBUG=False

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

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

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

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

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

    再次提交并推送修改。

    3.14 部署總結(jié)

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

    ①修改項目。如果創(chuàng)建了新文件,使用命令 git add. (最后有個句點?。⑺鼈兗拥紾it倉庫中。如果要遷移數(shù)據(jù)庫,也需要執(zhí)行該命令,因為每個遷移都生成了新的遷移文件。

    ②執(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打開一個遠(yuǎn)程終端會話,再執(zhí)行遷移。

    3.15 設(shè)置SECRET_KEY

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

    3.16 將項目從Heroku刪除

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

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

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


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

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

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

    相關(guān)文章

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

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

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

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

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

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

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

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

      yy13818512006 評論0 收藏0

    發(fā)表評論

    0條評論

    閱讀需要支付1元查看
    <