PythonDjango開(kāi)發(fā)實(shí)戰(zhàn)-ppt課件_第1頁(yè)
PythonDjango開(kāi)發(fā)實(shí)戰(zhàn)-ppt課件_第2頁(yè)
PythonDjango開(kāi)發(fā)實(shí)戰(zhàn)-ppt課件_第3頁(yè)
PythonDjango開(kāi)發(fā)實(shí)戰(zhàn)-ppt課件_第4頁(yè)
PythonDjango開(kāi)發(fā)實(shí)戰(zhàn)-ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩97頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Python Django 開(kāi)發(fā)實(shí)戰(zhàn)第1章 初識(shí) Django 框架Django 的 MTV 設(shè)計(jì)模式Django 提供的主要功能模塊Django 的產(chǎn)生背景Django 的產(chǎn)生背景開(kāi)發(fā) Web 站點(diǎn),通常需要做這樣的幾件事:構(gòu)建用戶賬戶體系,實(shí)現(xiàn) Web 站點(diǎn)的登錄與注冊(cè)功能數(shù)據(jù)表模型定義及訪問(wèn)功能實(shí)現(xiàn)編寫(xiě)業(yè)務(wù)邏輯實(shí)現(xiàn)站點(diǎn)功能后臺(tái)管理功能路由模型實(shí)現(xiàn)功能請(qǐng)求映射幾乎所有的 Web 站點(diǎn)都需要做這樣的事,且很多功能設(shè)計(jì)都是類似或一樣的,所以,這里會(huì)引入大量的重復(fù)工作。這里存在的問(wèn)題由此產(chǎn)生了 Web 框架的概念(思想),這也就是 Django 產(chǎn)生的根本原因!Django 的產(chǎn)生背景Djang

2、o 的版本發(fā)布過(guò)程版本類型版本說(shuō)明功能版本版本號(hào)定義為 A.B,A.B + 1 等,大約每 8 個(gè)月發(fā)布一次,每個(gè)版本包括 新功能以及對(duì)現(xiàn)有功能的改進(jìn)補(bǔ)丁版本版本號(hào)定義為 A.B.C,A.B.C + 1 等,用來(lái)修復(fù) bug 或者是安全問(wèn)題,補(bǔ) 丁版本是 100% 兼容相關(guān)的功能版本的,所以,除非是由于安全問(wèn)題或者是可能造 成數(shù)據(jù)丟失的情況之外,都應(yīng)該升級(jí)到最新的補(bǔ)丁版本LTS 版本長(zhǎng)期支持的版本,某些功能版本會(huì)被指定為 LTS 版本,比如 1.8LTS 版本,這類版本的安全更新時(shí)長(zhǎng)將達(dá)到至少三年說(shuō)明:Django 最后一個(gè)支持 Python2.7 的版本是 1.11LTS,而最新的 Djan

3、go 功能版本是 2.0,如果想使用最新版本的話,需要選擇 Python3。Django 的 MTV 設(shè)計(jì)模式UserControllerModelView數(shù)據(jù)庫(kù)發(fā)起請(qǐng)求返回響應(yīng)數(shù)據(jù)存取發(fā)送指令業(yè)務(wù)數(shù)據(jù)選擇視圖MVC 設(shè)計(jì)模式的交互過(guò)程對(duì)于 MVC 設(shè)計(jì)模式: M 即 Model,代表的是數(shù)據(jù)存取層,是對(duì)數(shù)據(jù)實(shí)體的定義和對(duì)數(shù)據(jù)的 CRUD 操作; V 即 View,代表的是視圖層,即系統(tǒng)中選擇顯示什么和怎么顯示的部分; C 即 Controller,代表的是 控制層,它負(fù)責(zé)根據(jù)從 View 中輸入的指令,檢索 Model 中的數(shù)據(jù),再以一定的邏輯產(chǎn)生最 終的結(jié)果輸出。Django 的 MTV

4、設(shè)計(jì)模式TemplateView發(fā)起請(qǐng)求Model數(shù)據(jù)庫(kù)數(shù)據(jù)存取User模板渲染返回響應(yīng)業(yè)務(wù)數(shù)據(jù)發(fā)送指令MTV 設(shè)計(jì)模式的交互過(guò)程對(duì)于 MTV 設(shè)計(jì)模式: M 即 Model,數(shù)據(jù)存取層,這一層里處理所有與數(shù)據(jù)相關(guān)的事務(wù),提供在數(shù)據(jù)庫(kù)中管理 (添加、修改、刪除)和查詢記錄的機(jī)制; T 即 Template,表現(xiàn)層,處理頁(yè)面的顯示,即所有與表現(xiàn)相關(guān)的決定都由這一層去處理; V 即 View,業(yè)務(wù)邏輯層,負(fù)責(zé)處理業(yè)務(wù)邏輯,會(huì)在適當(dāng)?shù)臅r(shí)候?qū)?Model 與 Template 組 合在一起,通常被認(rèn)為是聯(lián)通 M 與 T 的橋梁。Django 提供的主要功能模塊Django 中的 ORM ORM 全稱是

5、 Object Relational Mapping(對(duì)象關(guān)系映射),它把對(duì)象與數(shù)據(jù)庫(kù)中的表關(guān) 聯(lián)起來(lái),對(duì)象的屬性映射到表的各個(gè)字段,同時(shí),它把對(duì)表的操作對(duì)應(yīng)到對(duì)對(duì)象的操作,實(shí) 現(xiàn)了對(duì)象到 SQL,SQL 到對(duì)象的過(guò)程轉(zhuǎn)換。用戶模塊與權(quán)限系統(tǒng) 提供了用戶、用戶組、權(quán)限等概念;維護(hù)了用戶、用戶組和權(quán)限之間的關(guān)聯(lián)關(guān)系;包含了用戶鑒權(quán)與登錄等基本功能。Admin 后臺(tái)管理系統(tǒng) 對(duì)系統(tǒng)中定義的數(shù)據(jù)表(Model)提供了原生的后臺(tái)管理支持,且支持對(duì)管理頁(yè)面的個(gè)性化定制,例如,針對(duì)字段值的過(guò)濾功能、搜索功能、排 序功能,數(shù)據(jù)表字段的展示順序規(guī)則定義功能,字段歸類功能等等。Django 提供的主要功能模塊視

6、圖 Django 視圖是 MTV 設(shè)計(jì)模式中的 V,它在 Django 中的體現(xiàn)是一個(gè) Python 函數(shù)或者是 類,接收 Web 請(qǐng)求并返回 Web 響應(yīng)。模板系統(tǒng) 模板系統(tǒng)用于將頁(yè)面設(shè)計(jì)的 HTML 代碼和用于邏輯處理的 Python 代碼分離開(kāi)來(lái),即做到了數(shù)據(jù)與邏輯的分離,去除不同代碼之間的耦合。優(yōu)雅的表單系統(tǒng) Form 表單系統(tǒng)可以根據(jù) Form 對(duì)象的定義:自動(dòng)生成 HTML 表單元素、檢查表單數(shù)據(jù)的合法性、對(duì)不合法的表單數(shù)據(jù)進(jìn)行回顯,并提示錯(cuò)誤、將表單數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)的 Python 數(shù)據(jù)類型。Django 提供的主要功能模塊信號(hào)機(jī)制 Django 對(duì)信號(hào)機(jī)制的解釋是:在框架的不同位

7、置傳遞特定的消息給應(yīng)用程序執(zhí)行預(yù)定的操作。它是一種觀察者模式,或者叫做發(fā)布-訂閱模式。即當(dāng)系統(tǒng)中有 event(事件)發(fā)生, 一組 senders(發(fā)送者)將 signals(信號(hào))發(fā)送給一組 receivers(接收者),receivers 再去執(zhí)行預(yù)定的操作。路由系統(tǒng) 從 MTV 的設(shè)計(jì)模式中可以看到,用戶向 Web 站點(diǎn)發(fā)送請(qǐng)求(對(duì)應(yīng)到一個(gè) url),首先會(huì) 到達(dá)“對(duì)應(yīng)的”視圖,那么,這里的視圖是怎么對(duì)應(yīng)上的呢?這就是 Django 路由系統(tǒng)的作用。Django 利用 URLconf 構(gòu)建起 URL 模式與視圖函數(shù)之間的映射關(guān)系,即利用 Django 的 特定配置方式,設(shè)定好哪個(gè) url

8、 可以去執(zhí)行哪一段 Python 代碼。中間件 中間件是一個(gè)插件系統(tǒng),嵌入在 Django 的 Request 和 Response 之間執(zhí)行,可以對(duì)輸入 和輸出內(nèi)容作出修改。中間件是業(yè)務(wù)無(wú)關(guān)的技術(shù)類組件,是用來(lái)定義處理所有請(qǐng)求和響應(yīng)的通用處理架構(gòu)。Django 提供的主要功能模塊緩存系統(tǒng) 有時(shí)訪問(wèn) Web 站點(diǎn)的某一個(gè)服務(wù)會(huì)發(fā)現(xiàn)執(zhí)行的比較慢,這種情況發(fā)生的原因可能是背后有復(fù)雜的計(jì)算邏輯,也可能是訪問(wèn)數(shù)據(jù)庫(kù)系統(tǒng)或者文件系統(tǒng)造成的 IO 延遲等等。通常提 高 Web 站點(diǎn)執(zhí)行效率的方法是使用緩存,將經(jīng)常被用戶訪問(wèn)到的頁(yè)面結(jié)果保存下來(lái),再次 訪問(wèn)時(shí)只需要返回緩存的結(jié)果,不會(huì)再次執(zhí)行計(jì)算等類似耗時(shí)的

9、操作。 Django 提供一個(gè)健壯的緩存系統(tǒng),實(shí)現(xiàn)了不同級(jí)別的緩存粒度:可以緩存單個(gè)視圖的結(jié)果輸出,緩存難以生成的片段,或者是緩存整個(gè)網(wǎng)站。第2章 Django 開(kāi)發(fā)環(huán)境配置虛擬環(huán)境的安裝與配置Django 的安裝與配置Python 安裝與配置MySQL 的安裝與配置PyCharm 的安裝與配置Python 的安裝與配置Python:Linux 和 Mac OS X 默認(rèn)會(huì)附帶 Python 2.7,需要安裝 Python 3.7(Django 2.0 需要的 Python 版本 = 3.4)pip:Python 3.4 及以上版本內(nèi)置(更新:python3 -m pip install -U

10、 pip ),常用的基本命令如下表所示命令功能pip install 安裝 packagepip install U 升級(jí) packagepip uninstall 卸載 packagepip list 列出已經(jīng)安裝的 packagepip 常用的基本命令虛擬環(huán)境的安裝與配置Virtualenv:讓每個(gè)應(yīng)用/工程都有自己的運(yùn)行時(shí)環(huán)境,需要注意的地方安裝 Virtualenv:pip install virtualenv給 BBS 應(yīng)用創(chuàng)建虛擬環(huán)境(注意命名):virtualenv -p /usr/local/bin/python3.7 bbs_python37 進(jìn)入虛擬環(huán)境:source ./

11、bin/activate退出虛擬環(huán)境:deactivate Django 的安裝與配置Django 是 Python 包,使用 pip 工具在虛擬環(huán)境中安裝pip install django=2.0.7說(shuō)明:這里指定了需要安裝的 Django 的版本,如果不指定,pip 命令會(huì)選擇安裝最新的版本。驗(yàn)證在虛擬環(huán)境中安裝了 Django,且版本是指定的以上輸出顯示,當(dāng)前的 Python 虛擬環(huán)境成功安裝了 django 模塊,且版本號(hào)是 2.0.7,符合預(yù)期。MySQL 的安裝與配置需要去 MySQL 的官方網(wǎng)站下載適合操作系統(tǒng)的安裝文件。官網(wǎng)上面提供了兩種 安裝文件,一種是可以直接運(yùn)行的安裝包

12、,另一種是需要再去配置的壓縮包。本質(zhì)上來(lái)說(shuō),這兩種文件是一樣的,最好選擇第一種安裝文件,即應(yīng)用程序安裝包。開(kāi)始安裝安裝完成MySQL 的安裝與配置MySQL 安裝完成之后,默認(rèn)是不會(huì)加入到環(huán)境變量中去的,這里,手動(dòng)把 MySQL 的 可執(zhí)行文件加入到環(huán)境變量中去。操作系統(tǒng)環(huán)境變量說(shuō)明Windows對(duì)于 Windows 用戶比較簡(jiǎn)單,直接把 MySQL 安裝目錄下的 bin 加入到 PATH 變量中就可以了;Linux/Mac OS X對(duì)于 Linux 或 Mac OS X 用戶而言,MySQL 默認(rèn)安裝于 /usr/local/mysql 路徑下,需要把這個(gè)路徑下的 support-files

13、 和 bin 目錄都加入到系統(tǒng)環(huán)境(PATH)變量中。PyCharm 的安裝與配置PyCharm 是一種 Python IDE,它是一個(gè)跨平臺(tái)的開(kāi)發(fā)環(huán)境,官方提供 Windows、macOS 和 Linux 版本。目前,PyCharm 被社區(qū)認(rèn)為是最好用的 Python IDE。從官方網(wǎng)站中下載對(duì)應(yīng)于操作系統(tǒng)的版本,由于也是一個(gè)應(yīng)用程序,直接點(diǎn)擊安裝即可。安裝完成設(shè)置面板第3章 Django 項(xiàng)目框架搭建修改項(xiàng)目的默認(rèn)配置初始化項(xiàng)目環(huán)境Django 管理工具創(chuàng)建項(xiàng)目骨架Django 管理工具創(chuàng)建項(xiàng)目骨架django-admin:Django 提供的命令行管理工具startproject,用于創(chuàng)

14、建 Django 項(xiàng)目的子命令,在虛擬環(huán)境中執(zhí)行命令:django-admin startproject my_bbsmanage.py,用于管理 Django 項(xiàng)目的命令行工具,完成了項(xiàng)目骨架的創(chuàng)建之后,進(jìn)入到 my_bbs 容器目錄中就可以啟動(dòng)內(nèi)置的服務(wù)器運(yùn)行當(dāng)前的項(xiàng)目,執(zhí)行命令:python manage.py runserver startproject 是 django-admin 的子命令,用于創(chuàng)建項(xiàng)目。這里,使用這個(gè)子命令創(chuàng)建了 my_bbs 項(xiàng)目。正常情況下,執(zhí)行這個(gè)命令不會(huì)打印任何內(nèi)容,但是它會(huì)在當(dāng)前目錄下生成 一個(gè)項(xiàng)目的骨架,也可以稱作是項(xiàng)目的容器。 除了使用 runser

15、ver 啟動(dòng)項(xiàng)目之外,還可以使用 shell 命令進(jìn)入到當(dāng)前項(xiàng)目的環(huán)境中去:python manage.py shellDjango 管理工具創(chuàng)建項(xiàng)目骨架settings.py :Django 項(xiàng)目的配置文件BASE_DIR定義的是項(xiàng)目所在的完整路徑SECRET_KEY加密鹽,用于對(duì)加密數(shù)據(jù)做 Hash 處理DEBUG調(diào)試標(biāo)記,在開(kāi)發(fā)環(huán)境中設(shè)置為 trueALLOWED_HOSTS用于配置可以訪問(wèn)當(dāng)前站點(diǎn)的域名INSTALLED_APPS當(dāng)前項(xiàng)目需要加載的 app 包路徑列表MIDDLEWARE需要加載的中間件列表配置ROOT_URLCONF量標(biāo)記的是當(dāng)前項(xiàng)目的根 url 配置TEMPLATE

16、S列表變量,用于項(xiàng)目的模板配置WSGI_APPLICATIONWSGI 應(yīng)用程序?qū)ο蟮耐暾?Python 路徑修改項(xiàng)目的默認(rèn)配置配置語(yǔ)言環(huán)境和時(shí)區(qū)把 BBS 項(xiàng)目修改為中文簡(jiǎn)體:LANGUAGE_CODE = zh-Hans對(duì)時(shí)區(qū)不敏感: TIME_ZONE = Asia/Shanghai、USE_TZ = False配置開(kāi)發(fā)數(shù)據(jù)庫(kù)配置 MySQL:Engine(數(shù)據(jù)庫(kù)引擎)、NAME(數(shù)據(jù)庫(kù)名稱)、USER(數(shù)據(jù)庫(kù)用戶名)、PASSWORD(數(shù)據(jù)庫(kù)名稱)、HOST(數(shù)據(jù)庫(kù)服務(wù)器地址)、PORT(數(shù)據(jù)庫(kù)服務(wù)器端口號(hào))是由于 MySQLdb 不支持 Python3,所以 Django 連接 My

17、SQL 就不能再使用 MySQLdb 了,需要安裝 mysqlclient。在虛擬環(huán)境中執(zhí)行命令:pip install mysqlclient Django 自帶的 sqlite3 不適合做應(yīng)用項(xiàng)目的數(shù)據(jù)庫(kù),所以,這里用 MySQL 替代項(xiàng)目的默認(rèn)數(shù)據(jù)庫(kù),需要修改 DATABASES 配置。初始化項(xiàng)目環(huán)境INSTALLED_APPS 中定義應(yīng)用的數(shù)據(jù)庫(kù)遷移makemigrations:manage.py 的子命令,生成應(yīng)用遷移文件migrate:manage.py 的子命令,用于將應(yīng)用的模型定義或修改同步到數(shù)據(jù)庫(kù)中django_migrations:記錄每一次數(shù)據(jù)庫(kù)遷移動(dòng)作創(chuàng)建超級(jí)用戶登錄管

18、理后臺(tái)createsuperuser:manage.py 的子命令,用于創(chuàng)建超級(jí)用戶初始化項(xiàng)目環(huán)境給 BBS 項(xiàng)目創(chuàng)建應(yīng)用startapp:manage.py 的子命令,用于創(chuàng)建應(yīng)用Python 項(xiàng)目中的 requirements.txt 文件pip freeze:得到依賴清單pip install:重建項(xiàng)目環(huán)境將項(xiàng)目裝載到 IDE 中第4章 Django ORM 應(yīng)用與原理剖析Model 相關(guān)的概念與使用方法Model 的查詢操作 API構(gòu)建 post 應(yīng)用需要的數(shù)據(jù)表ORM 實(shí)現(xiàn)原理分析構(gòu)建 post 應(yīng)用需要的數(shù)據(jù)表post 應(yīng)用的 Models 定義BaseModel:抽象 Model

19、 基類,定義通用參數(shù)和通用屬性,直接繼承自 django.db.models.ModelTopic:話題 Model,繼承自 BaseModel,從而實(shí)現(xiàn)間接繼承Comment:話題評(píng)論 Model,繼承自 BaseModel,從而實(shí)現(xiàn)間接繼承 post 應(yīng)用承載這樣的幾個(gè)功能:用戶可以在 BBS 站內(nèi)發(fā)表話題,稱作 Topic可以針對(duì)每一個(gè) Topic 發(fā)表評(píng)論,稱作 Comment可以對(duì)每一個(gè) Comment 支持或者反對(duì)Topic 和 Comment 都實(shí)現(xiàn)了 _str_ 方法,且函數(shù)的返回值也很類似,都打 印了 id 和標(biāo)識(shí)內(nèi)容的字段,id 字段是在 Model 定義中沒(méi)有主動(dòng)指定主鍵

20、的情況下,Django 自動(dòng)加上去的。構(gòu)建 post 應(yīng)用需要的數(shù)據(jù)表post 應(yīng)用完成數(shù)據(jù)庫(kù)遷移INSTALLED_APPS:將 post 應(yīng)用加載到 BBS 項(xiàng)目中,將 post.apps.PostConfig 放在列表中的第一個(gè)執(zhí)行數(shù)據(jù)庫(kù)遷移: python manage.py makemigrations post:在 post/migrations 包下面生成遷移文件 python manage.py sqlmigrate post 0001:打印遷移文件執(zhí) 行的 SQL 語(yǔ)句 python manage.py check:檢查遷移 SQL 語(yǔ)句中的問(wèn)題 python manage.

21、py migrate:將 Models 映射為數(shù)據(jù)庫(kù)的表數(shù)據(jù)表名稱:由于在 Topic 和 Comment 中都沒(méi)有顯示的指定表名,所以,應(yīng)用 Django 的規(guī)則,將表名定義為,應(yīng)用名_小寫(xiě)類名,即 post_topic 和 post_comment 編寫(xiě)完成了 post 應(yīng)用的 Models 定義,為了實(shí)現(xiàn)對(duì)這些 Models 對(duì)象的操作,需要使用 manage.py 提供的數(shù)據(jù)庫(kù)遷移工具將 Models 對(duì)象映射為數(shù)據(jù)庫(kù)中的表。Model 相關(guān)的概念與使用方法Model 的組成部分django.db.models.ModelMeta 元數(shù)據(jù)數(shù)據(jù)表項(xiàng) FieldMeta 元數(shù)據(jù)類屬性abs

22、tractdb_tableindexesunique_togetherField 通用字段選項(xiàng)blankuniquenulldb_indexdb_columndefaultprimary_keychoiceshelp_text基礎(chǔ)字段類型django.db.models.FieldIntegerFieldAutoFieldCharFieldTextFieldBooleanFieldDateFieldDateTimeFieldEmailFieldSignFieldModel 相關(guān)的概念與使用方法三種關(guān)系字段類型ForeignKeyOneToOneFieldManyToManyFieldModel

23、 的繼承模型抽象基類多表繼承代理模型Model 的查詢操作 API創(chuàng)建 Model 實(shí)例對(duì)象返回單實(shí)例的查詢方法使用 save 方法創(chuàng)建 Model 實(shí)例使用 create 方法創(chuàng)建 Model 實(shí)例使用 get 查詢使用 get_or_create 查詢Model 的查詢操作 API返回 RawQuerySet 的查詢方法返回 QuerySet 的查詢方法 Topic.objects.all() :使用 all 方法獲取所有的數(shù)據(jù)記錄 Topic.objects.reverse() :使用 reverse 方法獲取逆序數(shù)據(jù)記錄 Topic.objects.order_by(-title, c

24、reated_time) :使用 order_by 方法自定義排序規(guī)則 Comment.objects.filter(up_gte=30):使用 filter 方法過(guò)濾數(shù)據(jù)記錄 Comment.objects.exclude(up_lt=29):使用 exclude 方法反向過(guò)濾 Comment.objects.values(id, up):使用 values 方法獲取字典結(jié)果 Comment.objects.values_list(id, up):使用 values_list 方法獲取元組結(jié)果 Comment.objects.all():2:對(duì) QuerySet 進(jìn)行切片 Topic.obj

25、ects.raw(SELECT id FROM post_topic WHERE title = %s, first topic) Comment.objects.raw(SELECT * FROM post_comment)0:RawQuerySet 支持索引和切片Model 的查詢操作 API返回其他類型的查詢方法存在關(guān)聯(lián)關(guān)系的查詢 Comment.objects.filter(id_gt=1).count():返回 QuerySet 的對(duì)象數(shù)量 Comment.objects.filter(id_gt=1).exists():判斷 QuerySet 是否包含對(duì)象 Comment.obje

26、cts.filter(id=1).update(up=90, down=33):使用 update 方法更新 Model 實(shí)例 Topic.objects.filter(id_lte=2).delete():使用 delete 方法刪除 Model 實(shí)例 ment_set.filter(content=very good!):Model 的反向查詢 Comment.objects.filter(topic_title_contains=first):跨關(guān)聯(lián)關(guān)系查詢Model 的查詢操作 APIF 和 Q 查詢聚合和分組查詢 Comment.objects.filter(up_lte=F(dow

27、n):要查詢 up 小于等于 down 的 Comment Comment.objects.filter(up_gt=F(down) * 2):查詢所有 up 值大于 down 值 2 倍的 Comment 對(duì)象 Topic.objects.filter(Q(title_contains=topic):查詢 title 中包含 topic 的所 有 Topic 對(duì)象 Comment.objects.filter(topic=1).aggregate(Sum(up):首先得到 id 為 1 的 Topic 的 Comment 對(duì)象,之后,計(jì)算 up 值的加和 Comment.objects.va

28、lues(topic_id).annotate(Sum(up).order_by():得到每一個(gè) Topic 的所有 Comment 的 up 加和ORM 實(shí)現(xiàn)原理分析Python 元類類是用來(lái)生成對(duì)象的、類也是對(duì)象、元類是用來(lái)創(chuàng)建類的type 中定義了創(chuàng)建類的三要素:類名、父類、屬性字典Python 描述符描述符協(xié)議: _get_、_set_、_delete_為什么要繼承自 models.Model自動(dòng)添加的自增主鍵自動(dòng)添加的查詢管理器Manager 是怎么實(shí)現(xiàn)的ORM 實(shí)現(xiàn)原理分析一次完整的 ORM 實(shí)現(xiàn)過(guò)程Topic.objects.filter(id_lte=2)開(kāi)始安裝 Manage

29、rModel 與 Manager 進(jìn)行掛鉤Manager 調(diào)用 QuerySet 的 filter 方法驗(yàn)證和解析 filter 參數(shù)獲取對(duì)應(yīng)的 Complier生成 sql 并執(zhí)行QuerySet 將返回結(jié)果進(jìn)行 to python 的格式轉(zhuǎn)換由 Query 完成To Python Object結(jié)束QuerySet.filter第5章 Django 管理后臺(tái)使用管理后臺(tái)操作 Model 對(duì)象實(shí)例使用 ModelAdmin 自定義管理后臺(tái)將 Model 注冊(cè)到管理后臺(tái)管理后臺(tái)實(shí)現(xiàn)原理分析將 Model 注冊(cè)到管理后臺(tái)啟用管理后臺(tái)的準(zhǔn)備工作settings.py 文件中的配置:Admin 同樣是

30、 Django 的一個(gè)應(yīng)用,除了要在 INSTALLED_APPS 中加載自身之外,還有依賴應(yīng)用、中間件應(yīng)用數(shù)據(jù)庫(kù)遷移:既然是應(yīng)用,就可能定義了 Model。Admin 應(yīng)用在數(shù)據(jù)庫(kù)遷移過(guò)程中只創(chuàng)建了一張 表:django_admin_log,用于記錄通過(guò)在管理后臺(tái)中完成的對(duì) Model 的添加、更改和刪除操作。django_admin_log 表結(jié)構(gòu)將 Model 注冊(cè)到管理后臺(tái)admin.py: manage 的 startapp 命令在創(chuàng)建 post 應(yīng)用的時(shí)候會(huì)自動(dòng)的創(chuàng)建 admin.py 文件,想要把自 定義的 Model 注冊(cè)到管理后臺(tái),就需要在這個(gè)文件中進(jìn)行聲明實(shí)現(xiàn) Model

31、的注冊(cè)需要注冊(cè)的 Model:Topic、Comment(post 應(yīng)用中定義的)Model 在管理后臺(tái)中顯示的名稱:可以通過(guò) Meta 元數(shù)據(jù)指定from django.contrib import admin from post.models import Topic, Comment admin.site.register(Topic, Comment)自定義 Model 顯示的名稱使用管理后臺(tái)操作 Model 對(duì)象實(shí)例管理后臺(tái)中的基本操作ChangeList:管理后臺(tái)中列出的 Model 對(duì)象實(shí)例的頁(yè)面Topic 的 ChangeList 頁(yè)面動(dòng)作工具欄:常被用于對(duì)實(shí)例對(duì)象的批處理操作

32、,目前只有一個(gè)動(dòng)作可以使用: “刪除所選的話題”,勾選實(shí)例,點(diǎn)擊執(zhí)行,可以將其從數(shù)據(jù)表中刪除。Model 實(shí)例對(duì)象列表:這里會(huì)展示 Topic 對(duì)應(yīng)數(shù)據(jù)表的數(shù)據(jù)記錄,數(shù)據(jù)記錄的 名稱取自 _str_ 函數(shù)的返回值。Model 實(shí)例對(duì)象總數(shù):位于實(shí)例列表的下方(如圖中顯示的“3 話題”),Django 會(huì)使用 SELECT COUNT(*) 的方式獲取記錄總數(shù)。增加 Model 實(shí)例對(duì)象:位于頁(yè)面的右上角,點(diǎn)擊按鈕即可跳轉(zhuǎn)到 Model 的添加 頁(yè)面。使用管理后臺(tái)操作 Model 對(duì)象實(shí)例管理后臺(tái)中的基本操作ChangeForm:可以實(shí)現(xiàn)編輯 Model 對(duì)象的頁(yè)面Topic 的 ChangeF

33、orm 頁(yè)面對(duì)于 ChangeForm 頁(yè)面,需要知道它的一些重要特性:字段展示的順序與在 Model 中定義的順序相同,但是需要注意,主鍵和不可編輯的字段不會(huì)顯示。字段展示的控件由字段類型決定,例如字符類型的 title 用文本框展示、布爾類 型的 is_online 用復(fù)選框展示等等。字段下方的文字提示由字段定義的 help_text 參數(shù)指定,例如 title 字段顯示的 “話題標(biāo)題”。對(duì)字段的修改內(nèi)容如果不合法,頁(yè)面會(huì)給出錯(cuò)誤提示。頁(yè)面最下方的按鈕實(shí)現(xiàn)字面意思的功能,對(duì)于刪除操作需要注意,級(jí)聯(lián)刪除的特性可能會(huì)導(dǎo)致其他 Model 對(duì)象實(shí)例被刪除。右上角的歷史按鈕可以查看從當(dāng)前管理頁(yè)面操

34、作當(dāng)前實(shí)例對(duì)象的記錄。使用管理后臺(tái)操作 Model 對(duì)象實(shí)例django_admin_log:記錄管理后臺(tái)操作歷史的 log 表管理后臺(tái)操作歷史管理后臺(tái)展示變更歷史:在ChangeForm 頁(yè)面,點(diǎn)擊頁(yè)面右上角的“歷史” 按鈕進(jìn)入到變更歷史頁(yè)Model 實(shí)例對(duì)象變更歷史django_admin_log 表中記錄的實(shí)例變更歷史使用 ModelAdmin 自定義管理后臺(tái)注冊(cè) Model 到 Admin 的兩種方式ModelAdmin 的常用屬性register 方法register 裝飾器利用 actions 豐富動(dòng)作工具欄利用 list_display 修改 ChangeList 的顯示列利用

35、search_fields 給 ChangeList 添加搜索框利用 list_filter 給 ChangeList 添加過(guò)濾器利用 ordering 重新定義 Model 實(shí)例的順序分頁(yè)相關(guān)的屬性利用 get_queryset 限制返回的數(shù)據(jù)記錄利用 fields 自定義顯示 Model 的字段利用 fieldsets 將 ChangeForm 中的字段分組顯示利用 readonly_fields 將部分字段設(shè)置為只讀利用 raw_id_fields 降低數(shù)據(jù)庫(kù)檢索開(kāi)銷利用 save_model 定制實(shí)例對(duì)象的保存操作管理后臺(tái)實(shí)現(xiàn)原理分析Python 裝飾器contenttypes 應(yīng)用分

36、析簡(jiǎn)單裝飾器帶參數(shù)的裝飾器ContentType 可以動(dòng)態(tài)的訪問(wèn) Model 對(duì)象Django 內(nèi)置應(yīng)用,記錄項(xiàng)目中所有 app 和 model 的對(duì)應(yīng)關(guān)系,并記錄于 ContentType 中model_class 方法用于獲取當(dāng)前 ContentType 實(shí)例所對(duì)應(yīng)的 Model 對(duì) 象get_object_for_this_type通過(guò)傳遞關(guān)鍵字參數(shù)可以獲取到 Model 實(shí)例對(duì)象get_all_objects_for_this_type根據(jù)提供的關(guān)鍵字參數(shù)返回 QuerySetget_for_id通過(guò) id 獲取 ContentType 實(shí)例對(duì)象get_for_model根據(jù)傳遞的Mo

37、del或Model實(shí)例獲取對(duì)應(yīng)的ContentType實(shí)例對(duì)象裝飾器本質(zhì)上是一個(gè)函數(shù)或類,它的返回值也是一個(gè)函數(shù)或類。第6章 視圖視圖的高級(jí)特性和快捷方法基于類的通用視圖視圖初探視圖工作原理分析視圖初探定義第一個(gè)視圖views.py:創(chuàng)建 post 應(yīng)用時(shí),由 Django 自動(dòng)創(chuàng)建,同時(shí) Django 也建議視圖定義在這個(gè)文件中,一個(gè)最簡(jiǎn)單的視圖: 每一個(gè)視圖都會(huì)接收一個(gè)請(qǐng)求,對(duì)請(qǐng)求進(jìn)行自定義處理,最后返回一個(gè)響應(yīng),這就已經(jīng)包含了一個(gè)視圖的完整定義了。from django.http import HttpResponsedef hello_django_bbs(request): html

38、 = Hello Django BBS return HttpResponse(html)這段代碼非常簡(jiǎn)單,只有四句話,但是已經(jīng)包含了一個(gè)視圖的完整功能了。解釋如下:引入 HttpResponse,作為視圖的返回類型視圖函數(shù)聲明,當(dāng)前的函數(shù)名是 hello_django_bbs,它僅僅描述自身的用途函數(shù)內(nèi)部定義業(yè)務(wù)處理邏輯,這里簡(jiǎn)單的定義了視圖的響應(yīng)內(nèi)容視圖最后返回一個(gè) HttpResponse 對(duì)象,標(biāo)識(shí)一次 Web 請(qǐng)求的結(jié)束視圖初探視圖的請(qǐng)求與響應(yīng)對(duì)象HttpRequest:每當(dāng)請(qǐng)求到來(lái)的時(shí)候,Django 就 會(huì)創(chuàng)建一個(gè)攜帶有請(qǐng)求元數(shù)據(jù)的 HttpRequest 對(duì)象,傳遞給視圖函數(shù)的

39、第一個(gè)參數(shù)。HttpRequest 定義了很多屬性和方法:HttpResponse:在視圖中創(chuàng)建并作為返回對(duì)象(主動(dòng)返回), HttpResponse 同樣定義了很多屬性和方法:method標(biāo)識(shí)請(qǐng)求所使用的 HTTP 方法scheme標(biāo)識(shí)請(qǐng)求的協(xié)議類型:http(s)path當(dāng)前請(qǐng)求頁(yè)面的路徑GET包含 GET 請(qǐng)求中的所有參數(shù)POSTPOST 請(qǐng)求中提交的表單數(shù)據(jù)status_code標(biāo)識(shí)一次請(qǐng)求的狀態(tài)content存儲(chǔ)響應(yīng)內(nèi)容的二進(jìn)制字符串write 方法這個(gè)方法將 HttpResponse 視為類文件對(duì)象,可以向其中添加響應(yīng)數(shù)據(jù)視圖初探基于類的視圖 視圖可以是函數(shù),也可以是類,類視圖同樣

40、能夠?qū)崿F(xiàn)視圖的功能。類視圖最大的特點(diǎn)是可以利用不同的實(shí)例方法響應(yīng)不同的 HTTP 請(qǐng)求方法(GET、POST),且可以利用面向?qū)ο蟮募夹g(shù)將代碼分解為可重用的組件。一個(gè)簡(jiǎn)單的類視圖定義FirstView 繼承自 View,它是所有基于類的視圖的基類。其中定義了 get 和 post 方法,映射到 GET 和 POST 請(qǐng)求類型。FirstView 重寫(xiě)了父類的 dispatch 方法,dispatch 根據(jù) HTTP 類型實(shí)現(xiàn)請(qǐng)求分發(fā), 例如,如果是 GET 請(qǐng)求,則分發(fā)給 get 方法。如果 View 中沒(méi)有實(shí)現(xiàn)對(duì)應(yīng)請(qǐng)求類型的方法,則會(huì)返回 HttpResponseNotAllowed。視圖初

41、探動(dòng)態(tài)路由轉(zhuǎn)換器三要素:regex:字符串類型的類屬性,根據(jù)屬性名可以猜測(cè),這是一個(gè)正則表達(dá)式,用于匹配 URL 對(duì)應(yīng)位置的參數(shù)值to_python:參數(shù) value 是從 URL 中匹配到的參數(shù)值,通過(guò)強(qiáng)轉(zhuǎn)成對(duì)應(yīng)的類型傳遞給視圖函數(shù)to_url:將一個(gè) Python 類型的對(duì)象轉(zhuǎn)換為字符串,to_python 的反向操作默認(rèn)參數(shù):視圖也是普通的 Python 函數(shù),參數(shù)當(dāng)然也就可以有默認(rèn)值re_path:使用 re_path 的理由是 path 方法和轉(zhuǎn)換器都不能滿足需求 動(dòng)態(tài)路由即 URL 不是固定的,URL 中包含了傳遞給視圖的參數(shù)變量。視圖初探給 post 應(yīng)用添加視圖Topic 列表

42、視圖Topic 實(shí)例對(duì)象信息視圖給 Topic 實(shí)例對(duì)象添加評(píng)論的視圖 視圖中的代碼應(yīng)該盡量簡(jiǎn)潔,復(fù)雜的業(yè)務(wù)邏輯不應(yīng)該出現(xiàn)在視圖中,所以,通常會(huì)把邏輯或者 service 部分單獨(dú)放到一個(gè)文件中,例如:post_service.py。視圖的高級(jí)特性和快捷方法URL 的反向解析視圖重定向reverse 方法:通過(guò) URL 模式的名字或可調(diào)用的視圖對(duì)象,得到視圖 URL命名空間:應(yīng)用命名空間、實(shí)例命名空間redirect 方法:實(shí)現(xiàn) 302(臨時(shí))或 301(永久)重定向常用的快捷方法render 方法:將給定的模板和上下文字典組合,渲染返回 HttpResponse 對(duì)象render_to_re

43、sponse 方法:類似于 renderget_object_or_404、 get_list_or_404:獲取響應(yīng)或者返回 404基于類的通用視圖TemplateView 隨著應(yīng)用越來(lái)越多,重復(fù)性的業(yè)務(wù)邏輯也會(huì)越來(lái)越多,逐漸的會(huì)使開(kāi)發(fā)過(guò)程變得枯燥乏味。Django 意識(shí)到了這個(gè)問(wèn)題,它將常用的功能抽象出來(lái),給開(kāi)發(fā)者提供了基于類的通用視圖。 TemplateView 用于渲染模板,Django 中基于類的視圖都應(yīng)該繼承自 View,TemplateView 也不例外,當(dāng)視圖中沒(méi)有復(fù) 雜的業(yè)務(wù)邏輯,例如系統(tǒng)的引導(dǎo)頁(yè)面、歡迎頁(yè)面,使用 TemplateView 是非常簡(jiǎn)單方便的。其定義如下(位于

44、 django/views/generic/base.py 文件中): class TemplateView(TemplateResponseMixin, ContextMixin, View) 除了基本的 View 之外,TemplateView 還繼承了兩個(gè) Mixin:ContextMixin:這個(gè)類中定義了一個(gè)方法:get_context_data,它返回一個(gè)字典對(duì)象,用于渲染模板上下文。通常,在使用 TemplateView 時(shí)都會(huì)重寫(xiě)這個(gè)方法,給模板提供上下文數(shù)據(jù)。TemplateResponseMixin:這個(gè)類中定義了兩個(gè)重要的屬性:template_name 和 render

45、_to_response 方法。其中,template_name 用于指定模板路徑,它是必須要提供的;render_to_response 方法根據(jù)模板路徑和上下文數(shù)據(jù)(context)返回 TemplateResponse。基于類的通用視圖RedirectView 頁(yè)面重定向在 Web 開(kāi)發(fā)中也是很常見(jiàn)的行為,所以,Django 為重定向功能的實(shí)現(xiàn)提供了通用類視圖 RedirectView。它定義于 django/views/generic/base.py 文件中,看一看它的定義:RedirectView 的定義RedirectView 中定義了四個(gè)類屬性和兩個(gè)方法:permanent:標(biāo)識(shí)

46、是否使用永久重定向,默認(rèn)是 False,所以,默認(rèn)情況下實(shí)現(xiàn)的是臨時(shí)重定向,即 302 響應(yīng)url:重定向的地址pattern_name:重定向目標(biāo) URL 模式的名稱(即 path 中的 name 參數(shù))query_string:是否將查詢字符串拼接到新地址中,默認(rèn)為 False,將丟棄原地址中的查詢字符串視圖工作原理分析解決一鍵多值問(wèn)題的 QueryDictMultiValueDict:dict 的子類,用來(lái)處理多個(gè)值對(duì)應(yīng)相同的鍵的場(chǎng)景QueryDict:繼承自 MultiValueDict 類視圖基類 Viewhttp_method_not_allowed 方法:返回 405,標(biāo)識(shí)當(dāng)前的

47、請(qǐng)求類型不被支持dispatch 方法:根據(jù) HTTP 請(qǐng)求類型調(diào)用 View 的同名函數(shù),實(shí)現(xiàn)請(qǐng)求分發(fā)as_view:創(chuàng)建 View 類實(shí)例,調(diào)用 dispatch 方法根據(jù)請(qǐng)求類型分發(fā)處理函數(shù)第7章 Django 模板系統(tǒng)模板系統(tǒng)語(yǔ)法模板系統(tǒng)工作原理分析模板系統(tǒng)基礎(chǔ)模板系統(tǒng)基礎(chǔ)模板系統(tǒng)初使用Template 對(duì)象:使用字符串填充模板代碼,可能會(huì)拋出 TemplateSyntaxError 異常模板后端的默認(rèn)配置Context 對(duì)象:傳遞字典對(duì)象用于模板的渲染(變量替換)TEMPLATES:位于 settings.py 文件中,列表類型,每一個(gè)元素都是一個(gè)字典對(duì)象,每個(gè)字典對(duì)象代表了配置的模

48、板后端。字典中的 key 代表的含義如下:BACKEND:指定了要使用的模板引擎類帶點(diǎn)的 Python 路徑,Django 默認(rèn)使用的是 django.template.backends.django.DjangoTemplatesDIRS:一個(gè)目錄列表,指定模板文件的存放路徑。模板引擎將按照列表中定義的順序查找模板文件APP_DIRS:一個(gè)布爾值,如果為 True 時(shí),模板引擎會(huì)在已安裝應(yīng)用的 templates 子目錄中查找模板OPTIONS:指定額外的選項(xiàng),不同的模板引擎有著不同的可選額外參數(shù)模板系統(tǒng)語(yǔ)法模板變量與替換規(guī)則模板標(biāo)簽判斷執(zhí)行邏輯的 if 標(biāo)簽:與 endif 成對(duì)出現(xiàn),與

49、Python 中的 if、elif 類似字典查詢:a.b 查詢 ab屬性查詢:a.b 查詢 a.b方法調(diào)用:a.b 查詢 a.b()迭代序列元素的 for 標(biāo)簽:對(duì)列表或元組進(jìn)行迭代,與 Python 中的 for 語(yǔ)法類似獲取視圖訪問(wèn)地址的 url 標(biāo)簽:與 reverse 函數(shù)類似,避免在模板中對(duì)訪問(wèn)地址進(jìn)行硬編碼數(shù)字索引查詢:a.1 查詢 a1用于多行注釋的 comment 標(biāo)簽?zāi)0逑到y(tǒng)語(yǔ)法過(guò)濾器獲取變量長(zhǎng)度的 length 過(guò)濾器轉(zhuǎn)換字符大小寫(xiě)的過(guò)濾器:lower、upper獲取首個(gè)或末尾元素的過(guò)濾器:first、lasttruncatewords 過(guò)濾器截取指定個(gè)數(shù)的詞 過(guò)濾器用于在

50、顯示變量之前對(duì)變量的值進(jìn)行調(diào)整,它們?cè)谀0逯蟹浅3R?jiàn),使用管道符 號(hào)(“|”)指定。有些過(guò)濾器可以接受參數(shù),如果參數(shù)中帶有空格,需要用引號(hào)括起來(lái)。過(guò)濾器的特色是可以通過(guò)組合多個(gè)過(guò)濾器實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用。模板系統(tǒng)語(yǔ)法模板繼承 一些高級(jí)語(yǔ)言都會(huì)有繼承的功能,將通用的功能或?qū)傩詫?xiě)在父類(或基類)里面,子類繼承自父類,自動(dòng)擁有父類的所有屬性和方法。同時(shí),還可以通過(guò)重寫(xiě)父類中的屬性和方法實(shí)現(xiàn)定制。這樣的繼承特性,通過(guò)抽象共性,減少了大量的重復(fù)代碼。 Django 模板系統(tǒng)同樣支持繼承,這是一個(gè)非常有用的功能,在實(shí)際的項(xiàng)目開(kāi)發(fā)中模板繼承也是非常常見(jiàn)的。一個(gè)簡(jiǎn)單的父模板文件這個(gè)父模板文件中使用了 % block

51、% 標(biāo)簽,也就是可以被子模板覆蓋的 block。另外:block 標(biāo)簽成對(duì)出現(xiàn),需要 % endblock % 標(biāo)記結(jié)束需要給 block 標(biāo)簽起個(gè)名字,子模板中具有同樣名稱的 block 塊完成對(duì)父模板的替換子模板可以不需要定義父模板中的所有 block,此時(shí),子模板將原樣使用父模板中的內(nèi)容子模板需要使用 % extends % 標(biāo)簽繼承父模板,且必須是模板中的第一個(gè)標(biāo)簽,通常繼承聲明會(huì)放在文件的第一行模板系統(tǒng)工作原理分析模板文件實(shí)現(xiàn)加載的過(guò)程_engine_list方法獲取模板后端:根據(jù)配置獲取模板后端實(shí)例DjangoTemplates 加載模板文件:get_template 方法模板渲染

52、機(jī)制實(shí)現(xiàn)分析render 方法:實(shí)現(xiàn)對(duì)模板的渲染,包括了變量替換、過(guò)濾器執(zhí)行等等。最終,render 方法的返回就可以傳遞給 HttpResponse 作為視圖的響應(yīng)了。第8章 Django 表單系統(tǒng)使用表單系統(tǒng)實(shí)現(xiàn)表單表單系統(tǒng)的工作原理認(rèn)識(shí)表單認(rèn)識(shí)表單一個(gè)簡(jiǎn)單的表單 在 Web 站點(diǎn)中與后端服務(wù)進(jìn)行交互,通常使用表單提交的方式。表單提交數(shù)據(jù)到達(dá)后端,首先要對(duì)數(shù)據(jù)做校驗(yàn),對(duì)于不合法的數(shù)據(jù)需要拒絕并提示給前端,通過(guò)校驗(yàn)之后才能執(zhí)行服務(wù)返回響應(yīng)。這就是常見(jiàn)的表單創(chuàng)建與處理流程。如果不使用 Django 的表單系統(tǒng),實(shí)現(xiàn)步驟可以大致總結(jié)為:創(chuàng)建模板文件用于提交表單數(shù)據(jù)顯示表單與對(duì)表單數(shù)據(jù)處理的業(yè)務(wù)邏

53、輯 但是實(shí)現(xiàn)這樣的表單,需要假設(shè)用戶熟悉這個(gè)功能,不會(huì)輸入錯(cuò)誤。但是,實(shí)際情況是,用戶可能沒(méi)輸入查詢?cè)~就點(diǎn)擊搜索按鈕,導(dǎo)致搜索結(jié)果出錯(cuò)。同時(shí),也沒(méi)有告知用戶問(wèn)題出在了哪里。所以,這就暴露出當(dāng)前對(duì)表單的處理存在這樣的一些問(wèn)題:表單頁(yè)面沒(méi)有錯(cuò)誤提示視圖中缺少校驗(yàn)邏輯,即對(duì)用戶的輸入沒(méi)有做校驗(yàn),例如:是否為空、數(shù)據(jù)格式是否正確、類型是否滿足條件等等所以,自己實(shí)現(xiàn)一個(gè)可用的表單,需要?jiǎng)?chuàng)建表單模板,模板中包含需要提交給后端處理的數(shù)據(jù)以及對(duì)錯(cuò)誤提示信息的顯示處理提交表單的視圖,視圖中包含對(duì)表單數(shù)據(jù)的校驗(yàn)和業(yè)務(wù)處理邏輯,當(dāng)表單數(shù)據(jù)不合法時(shí),還需要給前端提示使用表單系統(tǒng)實(shí)現(xiàn)表單使用 Form 對(duì)象定義表單常用

54、的表單字段類型實(shí)現(xiàn)對(duì)所有字段的驗(yàn)證:Form 對(duì)象實(shí)例的 is_valid 方法根據(jù)字段定義生成 HTML表單字段類型的基類 Field 常見(jiàn)的屬性字段requiredwidgetlabelinitialhelp_text常用的表單字段類型CharFieldIntegerFieldBooleanFieldChoiceFieldEmailField自定義表單字段類型:實(shí)現(xiàn) clean 方法自定義表單的驗(yàn)證規(guī)則:以 clean_ 開(kāi)頭、字段名結(jié)尾的方法基于 Model 定制的表單表單系統(tǒng)的工作原理表單對(duì)象的創(chuàng)建過(guò)程Form:所有的表單對(duì)象都繼承自 Form表單對(duì)象校驗(yàn)的實(shí)現(xiàn)過(guò)程is_valid 方

55、法:定義于 BaseForm 中,校驗(yàn)過(guò)程的實(shí)現(xiàn)就是 is_valid 方法的實(shí)現(xiàn)表單對(duì)象生成 HTML 的實(shí)現(xiàn)過(guò)程_str_ 方法:print 打印對(duì)象實(shí)例,會(huì)調(diào)用 _str_ 方法,其中調(diào)用了 as_table 方法ModelForm 翻譯 Model 的實(shí)現(xiàn)過(guò)程第9章 用戶認(rèn)證系統(tǒng)權(quán)限管理用戶認(rèn)證系統(tǒng)的應(yīng)用用戶與身份驗(yàn)證用戶與身份驗(yàn)證用戶與用戶組 用戶認(rèn)證系統(tǒng)中定義了三個(gè) Model 用來(lái)標(biāo)識(shí)用戶與用戶關(guān)系,分別是 User(用戶)、AnonymousUser(匿名用戶)和 Group(用戶組)。User 對(duì)應(yīng)的數(shù)據(jù)表 auth_userusername:用戶名,具有唯一性限制,最大長(zhǎng)度

56、為 150 個(gè)字符,只可以包含字母、數(shù)字、.、+、-、_ 這些字符password:密碼,Django 并不會(huì)存儲(chǔ)原始密碼,存儲(chǔ)的實(shí)際是原始密碼經(jīng)過(guò)哈希處 理之后的值is_active:布爾值,標(biāo)識(shí)當(dāng)前用戶是否處于激活狀態(tài),默認(rèn)值是 Trueis_staff:布爾值,標(biāo)識(shí)用戶是否可以訪問(wèn)管理后臺(tái)。默認(rèn)為 False,即不可以is_superuser:布爾值,標(biāo)識(shí)是否是超級(jí)用戶,代表用戶擁有所有的權(quán)限。同樣,默 認(rèn)值是 False除了基礎(chǔ)屬性之外,User 中還定義了與 Group 和 Permission(權(quán)限)之間的關(guān)聯(lián)關(guān)系:groups = models.ManyToManyField(G

57、roup, .) user_permissions = models.ManyToManyField(Permission, .)用戶與身份驗(yàn)證用戶與用戶組 AnonymousUser 是實(shí)現(xiàn)了 User 接口的類,它在業(yè)務(wù)代碼中很少被直接使用到。最常見(jiàn) 的用法是對(duì)視圖的請(qǐng)求,對(duì)于未登錄用戶,request 的 user 屬性即指向 AnonymousUser。AnonymousUser 定義 AnonymousUser 定義了 User 的主要屬性,且都設(shè)置為“不可用”狀態(tài)。另外,對(duì)于 set_password、check_password、delete、save 方法,都直接拋出了 Not

58、ImplementedError 異常,并沒(méi)有對(duì)應(yīng)的實(shí)現(xiàn)。用戶與身份驗(yàn)證用戶與用戶組 Group 標(biāo)識(shí)的是 User 的集合,屬于同一個(gè)用戶組的所有用戶具有“一些”相同的屬性。Group Model 定義Group 只定義了一個(gè)基礎(chǔ)屬性字段:name,用于標(biāo)識(shí)組名。name 被限制為最長(zhǎng) 80 個(gè)字符,要求唯一性,但是對(duì)于字符內(nèi)容并沒(méi)有做要求。Group 還定義了與 Permission 之間的關(guān)聯(lián)關(guān)系, 所以, 它還會(huì)有一張關(guān)聯(lián)表: auth_group_permissionsauth_group_permissions 表結(jié)構(gòu)用戶組的概念主要有兩個(gè)作用:將一類用戶加入到一個(gè)用戶組中,方便對(duì)

59、這一類用戶的統(tǒng)一操作。例如:發(fā)送郵件可以指定用戶組而不需要逐個(gè)添加用戶加入到某一個(gè)用戶組的用戶自動(dòng)獲得當(dāng)前用戶組所擁有的權(quán)限用戶與身份驗(yàn)證用戶與用戶組 根據(jù)給定的條件或?qū)傩試L試獲取用戶對(duì)象的行為被稱為用戶認(rèn)證。這也是非常常見(jiàn)的功能,為此,Django 提供了 authenticate 方法用于對(duì)用戶身份進(jìn)行認(rèn)證。可以在 Shell 環(huán)境中簡(jiǎn)單使用這個(gè)方法:在 Shell 中使用 authenticate 方法驗(yàn)證用戶身份 authenticate 通常接受 username 與 password 作為參數(shù),如果通過(guò)認(rèn)證,則會(huì)返回 User 對(duì)象,否則,返回 None。權(quán)限管理權(quán)限管理定義權(quán)限的

60、數(shù)據(jù)表:Django 利用 Permission 表定義權(quán)限Permission 對(duì)應(yīng)的數(shù)據(jù)表 auth_permissionPermission 表的定義非常簡(jiǎn)單,只有三個(gè)屬性:name:權(quán)限顯示的名稱,最多允許 255 個(gè)字符content_type:關(guān)聯(lián) ContentType(記錄 app 與 model 的信息)codename:權(quán)限的名稱編碼,最多允許 100 個(gè)字符給 Model 添加自定義的權(quán)限:Django 也允許在定義 Model 時(shí)指定自定義的權(quán)限,只需要在 Model 的 Meta 中聲明即 可。給 Topic 添加一個(gè)查看的權(quán)限permissions 元選項(xiàng)中定義一個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論