python基础学习[python编程从入门到实践读书笔记(连载三)]:django学习笔记web项目
文章目錄
- Django項目:學習筆記web網頁
- 項目部署
- 參考
自己部署的網站,還是小有成就感的,畢竟踩過很多坑,實戰技能也有些許進步。
網站鏈接:http://lishizheng.herokuapp.com/
Django項目:學習筆記web網頁
建立虛擬環境
要使用Django,首先需要建立一個虛擬工作環境。虛擬環境是系統的一個位置,可在其中安裝包,并將之與其他Python包隔離。
為項目新建一個目錄,將其命名為learning_log,再在終端中切換到這個目錄,并執行如下命令創建一個虛擬環境
python -m venv ll_env這里運行了模塊venv,并使用它創建了一個名為ll_env的虛擬環境。
激活虛擬環境
如果你使用的是Windows系統,請使用命令
ll_env\Scripts\activate要停止使用虛擬環境,可執行命令
deactivate安裝Django
激活虛擬環境后,執行如下命令安裝Django:
pip install django在Django中新建項目
在虛擬環境依然處于活動狀態的情況下(ll_env包含在圓括號內),執行如下命令新建一個項目
django-admin startproject learning_log .注意:千萬別忘了這個句點,否則部署應用程序時將遭遇一些配置問題。如果忘記了這個句點,要刪除已創建的文件和文件夾(ll_env除外),再重新運行這個命令。
目錄learning_log包含4個文件,最重要的是settings.py、urls.py和wsgi.py。
- 文件settings.py指定Django如何與系統交互以及如何管理項目。在開發項目的過程中,我們將修改其中一些設置,并添加一些設置。
- 文件urls.py告訴Django,應創建哪些頁面來響應瀏覽器請求。
- 文件wsgi.py幫助Django提供它創建的文件,這個文件名是Web服務器網關接口(Web server gatewayinterface)的首字母縮寫。
創建應用程序
Django項目由一系列應用程序組成,它們協同工作讓項目成為一個整體。
命令startapp appname讓Django搭建創建應用程序所需的基礎設施。
比如
(ll_env)learning_log$ python manage.py startapp learning_logs定義模型
模型告訴Django如何處理應用程序中存儲的數據。在代碼層面,模型就是一個類,就像前面討論的每個類一樣,包含屬性和方法。
激活模型
要使用這些模型,必須讓Django將前述應用程序包含到項目中。為此,打開settings.py(它位于目錄learning_log/learning_log中),其中有個片段告訴Django哪些應用程序被安裝到了項目中并將協同工作。
當需要修改“學習筆記”管理的數據時,都采取如下三個步驟:修改models.py,對learning_logs調用makemigrations,以及讓Django遷移項目。
創建頁面
使用Django創建頁面的過程分三個階段:定義URL,編寫視圖和編寫模板。按什么順序完成這三個階段無關緊要,但在本項目中,總是先定義URL模式。
- URL模式描述了URL是如何設計的,讓Django知道如何將瀏覽器請求與網站URL匹配,以確定返回哪個頁面。
- 每個URL都被映射到特定的視圖——視圖函數獲取并處理頁面所需的數據。
- 視圖函數通常使用模板來渲染頁面,而模板定義頁面的總體結構。
urls.py
"""定義learning_logs的URL模式""" from django.urls import path from . import viewsapp_name = 'learning_logs' urlpatterns = [# 主頁path('', views.index, name='index'), ]為指出當前位于哪個urls.py文件中,在該文件開頭添加一個文檔字符串。接下來,導入了函數path,因為需要使用它將URL映射到視圖。我們還導入了模塊views,其中的句點讓Python從當前urls.py模塊所在的文件夾導入views.py。變量app_name讓Django能夠將這個urls.py文件同項目內其他應用程序中的同名文件區分開來。在這個模塊中,變量urlpatterns是一個列表,包含可在應用程序learning_logs中請求的頁面。
實際的URL模式是對函數path()的調用,這個函數接受三個實參。第一個是一個字符串,幫助Django正確地路由(route)請求。收到請求的URL后,Django力圖將請求路由給一個視圖。為此,它搜索所有的URL模式,找到與當前請求匹配的那個。Django忽略項目的基礎URL(http://localhost:8000/),因此空字符串(’’)與基礎URL匹配。其他URL都與這個模式不匹配。如果請求的URL與任何既有的URL模式都不匹配,Django將返回一個錯誤頁面。
path()的第二個實參指定了要調用view.py中的哪個函數。請求的URL與前述正則表達式匹配時,Django將調用view.py中的函數index()。第三個實參將這個URL模式的名稱指定為index,讓我們能夠在代碼的其他地方引用它。每當需要提供到這個主頁的鏈接時,都將使用這個名稱,而不編寫URL。
第19章的部分成果
讓用戶擁有自己的數據
使用@login_required限制訪問
Django提供了裝飾器@login_required,讓你能夠輕松地只允許已登錄用戶訪問某些頁面。裝飾器(decorator)是放在函數定義前面的指令,Python在函數運行前根據它來修改函數代碼的行為。
將數據關聯到用戶
需將最高層的數據關聯到用戶,更低層的數據就會自動關聯到用戶。例如,在項目“學習筆記”中,應用程序的最高層數據是主題,而所有條目都與特定主題相關聯。只要每個主題都歸屬于特定用戶,就能確定數據庫中每個條目的所有者。
部分成果:
第20章開始
項目部署
這里用的是《python編程從入門到實踐(第二版)》
requirements.txt內容:
asgiref==3.3.4 beautifulsoup4==4.9.3 Django==3.2 django-bootstrap4==3.0.0 django-heroku==0.3.1 gunicorn==20.1.0 psycopg2>=2.6.1 pytz==2021.1 soupsieve==2.2.1 sqlparse==0.4.1注意:筆者剛開始git push heroku master的時候,老是報錯,原來是因為某個文件中heroku寫成了herocu,舉例如下:
remote: File "/tmp/build_b999a8c2/learning_log/settings.py", line 142, in <module> remote: django_herocu.settings(locals()) remote: NameError: name 'django_herocu' is not defined remote: remote: ! Error while running '$ python manage.py collectstatic --noinput'. remote: See traceback above for details. remote: remote: You may need to update application code to resolve this error. remote: Or, you can disable collectstatic for this application: remote: remote: $ heroku config:set DISABLE_COLLECTSTATIC=1 remote: remote: https://devcenter.heroku.com/articles/django-assets remote: ! Push rejected, failed to compile Python app. remote: remote: ! Push failed remote: Verifying deploy... remote: remote: ! Push rejected to vast-oasis-96898. remote: To https://git.heroku.com/vast-oasis-96898.git! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 'https://git.heroku.com/vast-oasis-96898.git'修改之后,使用命令git commit -am "一段話"重新commit。
然后執行git push heroku master,項目就部署好了。
核實正確地啟動了服務器進程,請執行命令heroku ps:
(ll_env) PS D:\user\文檔\python\python_work\learning_log> heroku ps 【1】Free dyno hours quota remaining this month: 550h 0m (100%) Free dyno usage for this app: 0h 0m (0%) For more information on dyno sleeping and how to upgrade, see: https://devcenter.heroku.com/articles/dyno-sleeping【2】=== web (Free): gunicorn learning_logs.wsgi --log-file - (1) web.1: crashed 2021/04/15 16:54:59 +0800 (~ 5m ago)輸出指出了在接下來的一個月內,項目還可在多長時間內處于活動狀態【1】。編寫本書時,Heroku允許免費部署在一個月內最多有550小時處于活動狀態。項目的活動時間超過這個限制后,將顯示標準的服務器錯誤頁面,我們稍后將定制這個錯誤頁面。在【2】處,我們發現啟動了Procfile指定的進程。
heroku login 出現 Ip mismatch 怎么辦? ,先Ctrl+C終止,然后輸出
heroku login -i然后會提示你輸入heroku 的郵箱和密碼,然后就登錄進來。
然后輸入 heroku open,結果出現Application error
解決方法:
輸入heroku logs --tail
然后找到錯誤:顯示找不到learning_logs.wsgi,果然,這是筆者的錯誤,正確的應該是learning_log.wsgi,多寫了s,修改完Procfile文件,然后重新提交。
修改后:
然后重新提交
(ll_env) PS D:\user\文檔\python\python_work\learning_log> git status On branch master Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: Procfileno changes added to commit (use "git add" and/or "git commit -a") (ll_env) PS D:\user\文檔\python\python_work\learning_log> git commit -am "Procfile, modify learning_logs.wsgi into learning_log.wsgi" warning: LF will be replaced by CRLF in Procfile. The file will have its original line endings in your working directory [master f5db365] Procfile, modify learning_logs.wsgi into learning_log.wsgi1 file changed, 1 insertion(+), 1 deletion(-) (ll_env) PS D:\user\文檔\python\python_work\learning_log> git status On branch master nothing to commit, working tree clean (ll_env) PS D:\user\文檔\python\python_work\learning_log>然后重新部署到heroku
git push heroku master然后繼續執行:heroku open
大功告成
在Heroku上建立數據庫
果訪問這個部署的應用程序,將能夠像在本地系統上一樣使用它,但看不到在本地部署中輸入的任何數據(包括超級用戶賬戶),因為它們還沒有被復制到在線服務器。通常,不將本地數據復制到在線部署中,因為本地數據通常是測試數據。
你可分享“學習筆記”的Heroku URL,讓任何人都可使用它。
目前自己搭建的網頁的url地址為 :https://murmuring-escarpment-91471.herokuapp.com/
然后注冊了用戶,寫了自己的Learning Log。
參考
[1]埃里克·馬瑟斯.Python編程-從入門到實踐[M].北京:人民郵電出版社,2016
總結
以上是生活随笔為你收集整理的python基础学习[python编程从入门到实践读书笔记(连载三)]:django学习笔记web项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编程django项目djan
- 下一篇: python基础学习[python编程从