1.前言
該專欄學習筆記環境引數如下:
- Windows 10
- Xampp/Navicat for MySQL
- Python 3.8+
- Django 3.0.*
- Vue 2.6+
開發工具:
- PyCharm 專業版
- VS Code
補充說明:
本人電腦存在多個版本的python,那麼當你電腦存在多個版本python,如何使用?如何指定pip安裝到指定版本?透過py 選擇版本,然後進行相關命令操作。詳見:https://blog.csdn.net/stone_tigerLI/article/details/121496828,自行百度不贅訴
2.初識Django框架
2.1.Django介紹
Django分層設計也是透過MTV,區別於Flask,這些相關內容Django都有,不需要依賴擴充套件。安裝Django時,自己要在網上查詢一下你安裝的Django版本和你的Python版本相容不相容!
2.2.開發基礎知識
2.2.1.Django的安裝
- 方式一:pip安裝【推薦】 pip install django
- 方式二:前往官網pypi.org下載原始碼安裝,cd到setup.py目錄下,執行 python setup.py install
- 檢測是否安裝成功
import django django.__version__
2.2.2.Django專案的建立
- 方式一:使用命令列生成模板 django-admin[.py] startproject my_project ,這個命令的django-admin是什麼?在我們pip安裝好django後,在圖示目錄生成exe。命令引數含義:【.py】是可選的;startproject建立;my_project建立的專案名稱。
- 方式二:使用PyCharm建立專案,pycharm的一些配置,比如修改映象源啥的,參照之前Flask筆記:https://www.cnblogs.com/gltou/p/16985624.html
2.2.3.Django專案的檔案目錄結構
templates:模板目錄
test_django:專案目錄
- __init__.py:包的入口檔案
- asgi.py:部署配置
- settings.py:專案配置檔案
- urls.py:url訪問地址配置檔案
- wsgi.py:部署配置
manage.py:命令列管理工具
2.2.4.Django專案開發伺服器的啟動
啟動伺服器方式一: python manage.py runserver
啟動伺服器方式二:
思考:我想指定啟動的埠怎麼辦?
2.3.開發流程講解
2.3.1.開發伺服器的啟動配置
知識點1:選擇專案直譯器,透過cmd執行django-admin建立的專案需要進行選擇。pycharm方式建立的專案不需要選擇,因為在建立專案的時候已經選擇過了直譯器
知識點2:啟動開發伺服器 python manage.py runserver ,runserver常用引數
- 指定埠:
- 命令列啟動 python manage.py runserver 9527
- pycharm啟動
- 指定IP及埠:
- 命令列啟動python manage.py runserver 0.0.0.0:9527
- pycharm啟動
指定IP啟動後,根據頁面提示資訊,我們需要在setting.py配置ALLOWED_HOSTS,由於安全的需要,需要指定哪些主機是可以訪問的;新增好之後,再次訪問就OK了
2.3.2.專案模組的建立
建立示例hello模組: python manage.py startapp hello ,模組的含義以及生成的內容會在後面筆記中寫,該篇隨筆只是認識Django框架
2.3.3.完成第一個頁面
第一步:在views.py檔案中寫個函式
第二步:在urls.py配置規則
3.從請求到響應
3.1.從請求到響應
知識點:
- 瞭解URL的設計及配置
- 掌握檢視的定義及作用
- 掌握URL和檢視的關係
- 瞭解檢視響應的內容
什麼是檢視?
一個檢視函式,簡稱為檢視,是一個簡單的Python函式。函式定義的位置是在模組的views.py檔案中,傳入request引數,request這個引數是固定的必須得有,當然你也可以叫其他名字。
檢視函式的作用:就是接受一個請求,返回一個響應;
URL的設計:設計簡單優雅的URL:使用正規表示式、指定引數型別
URL的常用配置:函式 path(route,view,name,**kwargs) \函式 include(urls,namespace) ;path函式就是之前上述例子urls.py檔案中使用的,include函式就是我們在使用模組化開發的時候進行使用,希望把某一個模組下的url單獨進行管理,然後再把所有模組的url整合到一起,這個時候就需要用到include函式。
透過django專案的配置檔案settings.py我們看到,根url是圖示的urls檔案
include示例:按模組管理url,首先在hello模組下新建一個urls檔案
URL與檢視的關係:
- URL的正向解析
- URL的逆向解析,防止我們硬編嗎,類似flask中的url_for
檢視響應的內容:
- 可以是文字
- HTML內容
- 影像
- 甚至是404、重定向等
小結:檢視是一個Python函式,用來處理http請求。透過path和include函式配置url,將url和檢視函式關係建立起來。
3.2.在檢視中處理業務邏輯
3.2.1.響應HTML內容
3.2.2.獲取URL引數
- 獲取URL中指定型別的引數
- 獲取URL中正則匹配的引數
3.2.3.獲取GET引數
3.3.從檔案響應HTML內容
知識點:
- 回顧 響應HTML內容的原理
- 瞭解 render_to_string()函式
- 掌握 render()函式
3.3.1.響應HTML內容的原理
其實和FLASK差不多
- 第一步,從磁碟讀取HTML檔案
- 第二步,替換HTML中的特殊字元
- 第三步,傳送給瀏覽器
3.3.2.render_to_string()函式
render_to_string(template_name,context=None,request=None,using=None)
- template_name:模板名稱,必傳
- request:請求物件
- context:模板上下文物件(dict)
- using:模板引擎名稱(如:Jinja2)
補充說明:配置檔案settings.py檔案的TEMPLATES屬性說明
- BACKEND:模板引擎,現在預設是使用django自帶的模板引擎
- DIRS:模板目錄,去哪裡找html檔案
- APP_DIRS:為True時,代表可以在模組下面去找html檔案
- OPTIONS:配置選項
補充說明:Django框架尋找模板的順序,程式會先去根目錄的templates下尋找對應的html檔案,若根目錄下的templates下沒有對應的html檔案,程式會去模組下的templates尋找對應的html。若根目錄和模組目錄的templates都有這個html檔案,會執行根目錄下的html檔案。這個執行順序是無法修改的!
想讓程式去模組目錄裡面找html檔案怎麼配置呢?
3.3.3.render()函式
render(request,template_name,context=None,content_type=None,status=None,using=None) ,實際工作當中render()的使用頻率要高於render_to_string(),因為它使用起來更簡單。
- request:請求物件,必傳
- template_name:模板名稱,必傳
- context:模板上下文物件(dict)
- context_type:MIME型別,預設為text/html
- status:HTTP狀態碼
- using:模板引擎名稱(如:Jinja2)
3.4.請求響應物件
知識點:
- 掌握 請求到響應的流程
- 理解 請求物件
- 理解 響應物件
3.4.1.請求與響應
3.4.2.請求物件HttpRequest
請求物件HttpRequest其實是Django框架中寫好的一個類,它把我們每一次發過來的請求封裝成一個物件。檢視中使用的使用,方法傳遞進去的request,就是HttpRequest的例項。它裡面有一些常用的屬性和方法可以提供給我們使用:
- 請求方式method(POST/GET/.....)
- 請求頭資訊META/headers,META返回的更詳細,header返回的請求頭資訊常用的基本都在。反回的請求頭資訊都是JSON格式,常用的key資訊?
- REMOTE_ADDR:獲取請求的IP地址
- HTTP_USER_AGENT:使用者請求終端的資訊
- 獲取請求傳遞引數
- GET:GET請求引數
- POST:POST請求引數
- COOKIES:cookie資訊
- FILES:檔案資訊
示例程式碼:
1 # urls.py檔案照著圖片敲,後面就只貼上知識點程式碼 2 3 def http_request(request): 4 """請求練習""" 5 # 1. 請求方式 6 print(request.method) 7 8 # 2. 請求頭資訊 9 # 2.1 獲取請求頭資訊META和headers 10 # META 11 headers = request.META #詳細 12 print(headers) 13 # headers 14 print(request.headers) #簡略 15 16 # 2.2 根據key獲取具體屬性資訊 17 # 方式一:META.get(key) 18 ua = request.META.get('HTTP_USER_AGENT',None) 19 print(ua) 20 # 方式二:headers['key'],key的大小寫都支援 21 print(request.headers['User-Agent']) 22 print(request.headers.get('user-agent')) 23 24 # 3. 獲取請求引數request.Get.get() 25 name = request.GET.get('name','') 26 print(name) 27 print(request.GET.get('cookies')) 28 29 return HttpResponse('響應')
3.4.3.響應物件
常用響應物件
- HttpResponse
- HttpResponseRedirect:重定向
- JsonResponse:響應json
- FileResponse:響應檔案
響應物件之間的關係
下面將針對常用的響應物件的屬性和方法進行詳細闡述
HttpResponse
- status:設定HTTP響應狀態碼
- status_code檢視HTTP響應狀態碼
- content_type:設定響應的型別
- write():寫入響應內容
1 def http_response(request): 2 """響應練習""" 3 resp = HttpResponse('響應內容',status=201,content_type='text/html; charset=utf-8') 4 resp.status_code = 200 5 resp.write('lalallalalal') 6 print(resp.status_code) 7 return resp
JsonResponse
1 def http_response(request): 2 """響應練習""" 3 user_info = { 4 'name':'張三', 5 'age':34 6 } 7 return JsonResponse(user_info)
FileResponse
常見的Content-Type
- text/html:超文字標記語言文字(HTML)
- text/plain:普通文字
- text/xml:xml文件
- image/png、image/jpeg、image/git:圖片或圖形
- application/json:json資料型別
小結:請求物件就一個,響應物件可以有多種型別
3.5.檢視快捷方法
知識點:
- 瞭解 什麼是重定向:這個自行百度
- 掌握 如何實現重定向
實現URL訪問的重定向
- 方式一:使用HttpResponseRedirect重定向
- 方式二:使用redirect()快捷方式
思考:程式異常怎麼辦?磁碟滿了?資料庫崩了?
3.6.內建的檢視及重寫
知識點:
- 瞭解 常見的錯誤
- 掌握 重寫內建檢視
- 瞭解 處理靜態檔案
內建的錯誤處理檢視
- 400 Bad Request
- 403 Forbidden
- 404 Not Found
- 500 Internal Server Error
重寫內建的錯誤處理檢視
- 第一步:在專案urls.py中新增配置
- handler500 = “my_project.views.page_500”,給handler500報錯賦予處理錯誤檢視函式,為空時,使用框架自帶預設的
- handler400,handler403,handler404同上配置
- 第二步:切換到生產模式,將settings.py中的DEBUG改為False
示例
編寫錯誤處理檢視函式,實際專案中,位置一般不放在模組裡面,因為這是所有模組可以公用的。
由於公用,因此新增到根目錄的urls.py檔案中。指定處理500報錯的檢視
模組業務邏輯檢視中,raise丟擲錯誤
配置檔案中將環境改為生產環境,注意改為False時,ALLOWED_HOSTS屬性不能為空值,否則報錯。
訪問raise丟擲錯誤的模組url。
注意:400幾個的handler,如果編寫其對應的檢視處理函式時,需要傳遞其他的引數?。後面的筆記中用到400幾個handler的時候,會進行詳述。
static.serve處理靜態檔案
實際專案中會有許多靜態檔案,有使用者上傳的圖片,有專案自帶的js、css、圖片等等。透過django如何展示呢,上面有提到可以透過fileresponse物件展示,還有沒有其他辦法?透過static.server進行處理
- 第一步:在專案settings.py中新增配置
- MEDIA_URL='/media/' :表示媒體media的URL。下面的示例沒有新增該配置項,後面專案實戰筆記會闡述該配置的作用。
- MEDIA_ROOT=os.path.join(BASE_DIR,'medias') :我們靜態檔案存放的位置
- 第二步:在urls.py中新增配置,將我們進行開發的時候,把專案當中的靜態檔案,放到django內建伺服器當中,是我們可以直接進行訪問。
?圖,官方說在開發模式下進行使用,為什麼呢?因為django內建的伺服器就是開發伺服器,肯定不能滿足生產環境的需要。在實際生產環境中呢,我們會使用其他的方式進行處理,後面會講。此處重要內容是處理靜態檔案,知道透過django自帶的伺服器,可以訪問靜態檔案。衍生跟專案相關的,後面筆記有。
處理靜態檔案示例:
在settings.py中新增MEDIA_ROOT,指明靜態檔案存放的位置。
如何指明靜態檔案存放的位置,使用絕對路徑還是相對路徑?在配置檔案一開始,我們看到django自帶的變數BASE_DIR代表的就是當前專案目錄
在urls.py檔案中新增圖示配置,那這段程式碼是什麼意思?如果我們開啟了除錯模式即開發模式。在urlpatterns中追加一個路由定址,透過正則匹配,media開頭任意結尾。呼叫的檢視是django.views.static自帶的serve。document_root指向我們剛剛在settings.py檔案中新增的變數MEDIA_ROOT,即靜態檔案目錄。
settings.py開啟開發模式,訪問地址(按照我們新增的規則,路由即media/開頭),發現成功訪問靜態檔案
思考:我們在settings.py檔案新增靜態檔案目錄MEDIA_ROOT時,發現有一個STATIC_URL變數,這個是幹什麼用的?
Django有兩種靜態檔案:
- medias 稱為媒體資料夾,主要用來儲存使用者上傳的檔案,例如圖片等,是變動的,由使用者定義的檔案,如使用者頭像, 使用者上傳的圖片或影片等;
- static 稱為靜態資料夾,主要存的是CSS, JavaScript, 網站logo等不變的檔案,是不變的,形成網站的核心部件,如 CSS檔案,JS檔案,背景圖片等;
settings中的STATIC_URL = 'static/'配置是靜態路由對映,就是可以讓django利用STATIC_URL來讓瀏覽器可以直接訪問static下的靜態檔案。在urls.py對static檔案路徑進行配置
setting檔案中對STATIC_URL進行配置,預設是static目錄,也可以自行定義。
3.7.使用class重寫檢視
思考:檢視函式如何使用物件導向程式設計思想進行改寫?
知識點:
- 理解 類檢視概念
- 掌握 實現類檢視
- 瞭解 類檢視的本質
- 瞭解 內建通用檢視
基於類的檢視
- 檢視是一個可呼叫的物件,可以接受一個請求然後返回一個響應
- 基於類的檢視可以結構化你的檢視,簡化你的檢視程式碼
- 基於類的檢視可以利用繼承和混合(多重繼承),重用/複用程式碼
- 內建的檢視拿來即用,程式碼更簡潔
示例程式碼:
繼承檢視,配置模板地址。不像之前還需要加return render()返回響應,配置模板地址即可
配置URL,HomeView繼承了TemplateView類,使用自帶的as_view()方法透過HomeView類找到檢視
成功訪問
TemplateView是如何根據我傳入一個模板檔名,就能找到模板呢?其實就是前面3.3.2的補充說明部分
常見的內建通用檢視:後面筆記會對其詳細闡述
小結:使用class改寫檢視實際上是物件導向改造的過程,Django內建的通用檢視使程式碼更簡單