目錄
20.2.15 確保項目的安全
settings.py
20.2.16 提交并推送修改
20.2.17 創(chuàng)建自定義錯誤頁面
1. 創(chuàng)建自定義模板
500.html
settings.py
settings.py
注意
views.py
20.2.18 繼續(xù)開發(fā)
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
20.2.15 確保項目的安全
當前,我們部署的項目存在一個嚴重的安全問題:settings.py包含設置DEBUG=True,它在發(fā)生錯誤時顯示調(diào)試信息。開發(fā)項目時,Django的錯誤頁面向你顯示了重要的調(diào)試信息,如果將項目 部署到服務器后依然保留這個設置,將給攻擊者提供大量可供利用的信息。我們還需確保任何人 都無法看到這些信息,也不能冒充項目托管網(wǎng)站來重定向請求。 下面來修改settings.py,以讓我們能夠在本地看到錯誤消息,但部署到服務器后不顯示任何 錯誤消息:
settings.py
--snip--
# Heroku設置
if os.getcwd() == '/app':
--snip--
# 讓request.is_secure()承認X-Forwarded-Proto頭
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# 只允許Heroku托管這個項目
1 ALLOWED_HOSTS = ['learning-log.herokuapp.com']
2 DEBUG = False
# 靜態(tài)資產(chǎn)配置
--snip--
我們只需做兩方面的修改。在1處,修改ALLOWED_HOSTS,只允許Heroku托管這個項目。你需 要使用應用程序的名稱,可以是Heroku提供的名稱(如afternoon-meadow-2775.herokuapp.com), 也可以是你選擇的名稱。在2處,我們將DEBUG設置為False,讓Django不在錯誤發(fā)生時顯示敏感 信息。
20.2.16 提交并推送修改
現(xiàn)在需要將對settings.py所做的修改提交到Git倉庫,再將修改推送到Heroku。下面的終端會 話演示了這個過程:
1 (ll_env)learning_log$ git commit -am "Set DEBUG=False for Heroku."
[master 081f635] Set DEBUG=False for Heroku.
1 file changed, 4 insertions(+), 2 deletions(-)
2 (ll_env)learning_log$ git status
# On branch master
nothing to commit, working directory clean
(ll_env)learning_log$
我們執(zhí)行命令git commit,并指定了一條簡短而具有描述性的提交消息(見1)。別忘了,標 志-am讓Git提交所有修改過的文件,并記錄一條日志消息。Git找出唯一一個修改過的文件,并將 所做的修改提交到倉庫。
2處顯示的狀態(tài)表明我們在倉庫的分支master上工作,當前沒有任何未提交的修改。推送到Heroku之前,必須檢查狀態(tài)并看到剛才所說的消息。如果你沒有看到這樣的消息,說明有未提交 的修改,而這些修改將不會推送到服務器。在這種情況下,可嘗試再次執(zhí)行命令commit,但如果 你不知道該如何解決這個問題,請閱讀附錄D,更深入地了解Git的用法。 下面來將修改后的倉庫推送到Heroku:
(ll_env)learning_log$ git push heroku master
--snip--
remote: -----> Python app detected
remote: -----> Installing dependencies with pip
--snip--
remote: -----> Launching... done, v8
remote: https://learning-log.herokuapp.com/ deployed to Heroku
remote: Verifying deploy.... done.
To https://git.heroku.com/learning-log.git
4c9d111..ef65d2b master -> master
(ll_env)learning_log$
Heroku發(fā)現(xiàn)倉庫發(fā)生了變化,因此重建項目,確保所有的修改都已生效。它不會重建數(shù)據(jù)庫, 因此這次無需執(zhí)行命令migrate。 現(xiàn)在要核實部署更安全了,請輸入項目的URL,并在末尾加上我們未定義的擴展。例如,嘗 試訪問http://learning-log.herokuapp.com/letmein/。你將看到一個通用的錯誤頁面,它沒有泄露任 何有關該項目的具體信息。如果你嘗試向本地的“學習筆記”發(fā)出同樣的請求——輸入URL http://localhost:8000/letmein/,你將看到完整的Django錯誤頁面。這樣的結果非常理想,你接著開 發(fā)這個項目時,將看到信息豐富的錯誤消息,但用戶看不到有關項目代碼的重要信息。
20.2.17 創(chuàng)建自定義錯誤頁面
在第19章,我們對“學習筆記”進行了配置,使其在用戶請求不屬于他的主題或條目時返回 404錯誤。你可能還遇到過一些500錯誤(內(nèi)部錯誤)。404錯誤通常意味著你的Django代碼是正確 的,但請求的對象不存在。500錯誤通常意味著你編寫的代碼有問題,如views.py中的函數(shù)有問題。 當前,在這兩種情況下,Django都返回通用的錯誤頁面,但我們可以編寫外觀與“學習筆記”一 致的404和500錯誤頁面模板。這些模板必須放在根模板目錄中。
1. 創(chuàng)建自定義模板
在文件夾learning_log/learning_log中,新建一個文件夾,并將其命名為templates;再在這個 文件夾中新建一個名為404.html的文件,并在其中輸入如下內(nèi)容:
404.html
{% extends "learning_logs/base.html" %}
{% block header %}
<h2>The item you requested is not available. (404)</h2>
{% endblock header %}
這個簡單的模板指定了通用的404錯誤頁面包含的信息,并且該頁面的外觀與網(wǎng)站的其他部 分一致。 再創(chuàng)建一個名為500.html的文件,并在其中輸入如下代碼:
500.html
{% extends "learning_logs/base.html" %}
{% block header %}
<h2>There has been an internal error. (500)</h2>
{% endblock header %}
這些新文件要求對settings.py做細微的修改:
settings.py
--snip--
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'learning_log/templates')],
'APP_DIRS': True,
--snip--
},
]
--snip-
這項修改讓Django在根模板目錄中查找錯誤頁面模板。
2. 在本地查看錯誤頁面
在將項目推送到Heroku之前,如果你要在本地查看錯誤頁面是什么樣的,首先需要在本地設 置中設置Debug=False,以禁止顯示默認的Django調(diào)試頁面。為此,可對settings.py做如下修改(請 確保你修改的是用于本地環(huán)境的settings.py部分,而不是用于Heroku的部分):
settings.py
--snip--
# 安全警告:不要在在線環(huán)境中啟用調(diào)試!
DEBUG = False
ALLOWED_HOSTS = ['localhost']
--snip--
DEBUG被設置為False時,你必須在ALLOWED_HOSTS中指定一個主機?,F(xiàn)在,請求一個不屬于你 的主題或條目,以查看404錯誤頁面;請求不存在的URL(如localhost:8000/letmein/),以查看500 錯誤頁面。 查看錯誤頁面后,將DEBUG重新設置為True,以方便你進一步開發(fā)“學習筆記”。(在settings.py 中用于Heroku部署的部分中,確保DEBUG依然被設置為False)。
注意
500錯誤頁面不會顯示任何有關當前用戶的信息,因為發(fā)生服務器錯誤時,Django不會通 過響應發(fā)送任何上下文信息。
3. 將修改推送到Heroku
現(xiàn)在需要提交對模板所做的修改,并將這些修改推送到Heroku
1 (ll_env)learning_log$ git add .
2 (ll_env)learning_log$ git commit -am "Added custom 404 and 500 error pages."
3 files changed, 15 insertions(+), 10 deletions(-)
create mode 100644 learning_log/templates/404.html
create mode 100644 learning_log/templates/500.html
3 (ll_env)learning_log$ git push heroku master
--snip--
remote: Verifying deploy.... done.
To https://git.heroku.com/learning-log.git
2b34ca1..a64d8d3 master -> master
(ll_env)learning_log$
在1處,我們執(zhí)行了命令git add,這是因為我們在項目中創(chuàng)建了一些新文件,因此需要讓 Git跟蹤這些文件。然后,我們提交所做的修改(見2),并將修改后的項目推送到Heroku(見3)。 現(xiàn)在,錯誤頁面出現(xiàn)時,其樣式應該與網(wǎng)站的其他部分一致,這樣在發(fā)生錯誤時,用戶將不 會感到突兀。
4. 使用方法get_object_or_404() 現(xiàn)在,如果用戶手工請求不存在的主題或條目,將導致500錯誤。Django嘗試渲染請求的頁 面,但沒有足夠的信息來完成這項任務,進而引發(fā)500錯誤。對于這種情形,將其視為404錯誤更 合適,為此可使用Django快捷函數(shù)get_object_or_404()。這個函數(shù)嘗試從數(shù)據(jù)庫獲取請求的對象, 如果這個對象不存在,就引發(fā)404異常。我們在views.py中導入這個函數(shù),并用它替換函數(shù)get():
views.py
--snip--
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect, Http404
--snip--
@login_required
def topic(request, topic_id):
"""顯示單個主題及其所有的條目"""
topic = get_object_or_404(Topic, id=topic_id)
# 確定主題屬于當前用戶
--snip--
現(xiàn)在,如果你請求不存在的主題(例如,使用URL http://localhost:8000/topics/999999/),將 看到404錯誤頁面。為部署這里所做的修改,再次提交,并將項目推送到Heroku。
20.2.18 繼續(xù)開發(fā)
將項目“學習筆記”推送到服務器后,你可能想進一步開發(fā)它或開發(fā)要部署的其他項目。更 新項目的過程幾乎完全相同。
首先,你對本地項目做必要的修改。如果在修改過程中創(chuàng)建了新文件,使用命令git add . (千萬別忘記這個命令末尾的句點)將它們加入到Git倉庫中。如果有修改要求遷移數(shù)據(jù)庫,也需 要執(zhí)行這個命令,因為每個遷移都將生成新的遷移文件。
然后,使用命令git commit -am "commit message"將修改提交到倉庫,再使用命令git push heroku master將修改推送到Heroku。如果你在本地遷移了數(shù)據(jù)庫,也需要遷移在線數(shù)據(jù)庫。為 此,你可以使用一次性命令heroku run python manage.py migrate,也可使用heroku run bash打 開一個遠程終端會話,并在其中執(zhí)行命令python manage.py migrate。然后訪問在線項目,確認 你期望看到的修改已生效。
在這個過程中很容易犯錯,因此看到錯誤時不要大驚小怪。如果代碼不能正確地工作,請重 新審視所做的工作,嘗試找出其中的錯誤。如果找不出錯誤,或者不知道如何撤銷錯誤,請參閱 附錄C中有關如何尋求幫助的建議。不要羞于去尋求幫助:每個學習開發(fā)項目的人都可能遇到過 你面臨的問題,因此總有人樂意伸出援手。通過解決遇到的每個問題,可讓你的技能穩(wěn)步提高, 最終能夠開發(fā)可靠而有意義的項目,還能解決別人遇到的問題。
關于“Python”的核心知識點整理大全62-CSDN博客
關于“Python”的核心知識點整理大全37-CSDN博客
關于“Python”的核心知識點整理大全25-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-777331.html
關于“Python”的核心知識點整理大全12-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-777331.html
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
到了這里,關于關于“Python”的核心知識點整理大全64的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!