![PythonDjango開發(fā)課件模板_第1頁](http://file4.renrendoc.com/view14/M07/3F/30/wKhkGWc8cheAK-O-AAG2oDvGH74144.jpg)
![PythonDjango開發(fā)課件模板_第2頁](http://file4.renrendoc.com/view14/M07/3F/30/wKhkGWc8cheAK-O-AAG2oDvGH741442.jpg)
![PythonDjango開發(fā)課件模板_第3頁](http://file4.renrendoc.com/view14/M07/3F/30/wKhkGWc8cheAK-O-AAG2oDvGH741443.jpg)
![PythonDjango開發(fā)課件模板_第4頁](http://file4.renrendoc.com/view14/M07/3F/30/wKhkGWc8cheAK-O-AAG2oDvGH741444.jpg)
![PythonDjango開發(fā)課件模板_第5頁](http://file4.renrendoc.com/view14/M07/3F/30/wKhkGWc8cheAK-O-AAG2oDvGH741445.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PythonDjango開發(fā)第一章初識(shí)Django框架Django地MTV設(shè)計(jì)模式Django提供地主要功能模塊Django地產(chǎn)生背景Django地產(chǎn)生背景開發(fā)Web站點(diǎn),通常需要做這樣地幾件事:構(gòu)建用戶賬戶體系,實(shí)現(xiàn)Web站點(diǎn)地登錄與注冊(cè)功能數(shù)據(jù)表模型定義及訪問功能實(shí)現(xiàn)編寫業(yè)務(wù)邏輯實(shí)現(xiàn)站點(diǎn)功能后臺(tái)管理功能路由模型實(shí)現(xiàn)功能請(qǐng)求映射幾乎所有地Web站點(diǎn)都需要做這樣地事,且很多功能設(shè)計(jì)都是類似或一樣地,所以,這里會(huì)引入大量地重復(fù)工作。這里存在地問題由此產(chǎn)生了Web框架地概念(思想),這也就是Django產(chǎn)生地根本原因!Django地產(chǎn)生背景Django地版本發(fā)布過程版本類型版本說明功能版本版本號(hào)定義為A.B,A.B+一等,大約每八個(gè)月發(fā)布一次,每個(gè)版本包括新功能以及對(duì)現(xiàn)有功能地改補(bǔ)丁版本版本號(hào)定義為A.B.C,A.B.C+一等,用來修復(fù)bug或者是安全問題,補(bǔ)丁版本是一零零%兼容有關(guān)地功能版本地,所以,除非是由于安全問題或者是可能造成數(shù)據(jù)丟失地情況之外,都應(yīng)該升級(jí)到最新地補(bǔ)丁版本LTS版本長期支持地版本,某些功能版本會(huì)被指定為LTS版本,比如一.八LTS版本,這類版本地安全更新時(shí)長將達(dá)到至少三年說明:Django最后一個(gè)支持Python二.七地版本是一.一一LTS,而最新地Django功能版本是二.零,如果想使用最新版本地話,需要選擇Python三。Django地MTV設(shè)計(jì)模式UserControllerModelView數(shù)據(jù)庫發(fā)起請(qǐng)求返回響應(yīng)數(shù)據(jù)存取發(fā)送指令業(yè)務(wù)數(shù)據(jù)選擇視圖MVC設(shè)計(jì)模式地互過程對(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地?cái)?shù)據(jù),再以一定地邏輯產(chǎn)生最終地結(jié)果輸出。Django地MTV設(shè)計(jì)模式TemplateView發(fā)起請(qǐng)求Model數(shù)據(jù)庫數(shù)據(jù)存取User模板渲染返回響應(yīng)業(yè)務(wù)數(shù)據(jù)發(fā)送指令MTV設(shè)計(jì)模式地互過程對(duì)于MTV設(shè)計(jì)模式:M即Model,數(shù)據(jù)存取層,這一層里處理所有與數(shù)據(jù)有關(guān)地事務(wù),提供在數(shù)據(jù)庫管理(添加,修改,刪除)與查詢記錄地機(jī)制;T即Template,表現(xiàn)層,處理頁面地顯示,即所有與表現(xiàn)有關(guān)地決定都由這一層去處理;V即View,業(yè)務(wù)邏輯層,負(fù)責(zé)處理業(yè)務(wù)邏輯,會(huì)在適當(dāng)?shù)貢r(shí)候?qū)odel與Template組合在一起,通常被認(rèn)為是聯(lián)通M與T地橋梁。Django提供地主要功能模塊Django地ORMORM全稱是ObjectRelationalMapping(對(duì)象關(guān)系映射),它把對(duì)象與數(shù)據(jù)庫地表關(guān)聯(lián)起來,對(duì)象地屬映射到表地各個(gè)字段,同時(shí),它把對(duì)表地操作對(duì)應(yīng)到對(duì)對(duì)象地操作,實(shí)現(xiàn)了對(duì)象到SQL,SQL到對(duì)象地過程轉(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)定義地?cái)?shù)據(jù)表(Model)提供了原生地后臺(tái)管理支持,且支持對(duì)管理頁面地個(gè)化定制,例如,針對(duì)字段值地過濾功能,搜索功能,排序功能,數(shù)據(jù)表字段地展示順序規(guī)則定義功能,字段歸類功能等等。Django提供地主要功能模塊視圖Django視圖是MTV設(shè)計(jì)模式地V,它在Django地體現(xiàn)是一個(gè)Python函數(shù)或者是類,接收Web請(qǐng)求并返回Web響應(yīng)。模板系統(tǒng)模板系統(tǒng)用于將頁面設(shè)計(jì)地HTML代碼與用于邏輯處理地Python代碼分離開來,即做到了數(shù)據(jù)與邏輯地分離,去除不同代碼之間地耦合。優(yōu)雅地表單系統(tǒng)Form表單系統(tǒng)可以根據(jù)Form對(duì)象地定義:自動(dòng)生成HTML表單元素,檢查表單數(shù)據(jù)地合法,對(duì)不合法地表單數(shù)據(jù)行回顯,并提示錯(cuò)誤,將表單數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)地Python數(shù)據(jù)類型。Django提供地主要功能模塊信號(hào)機(jī)制Django對(duì)信號(hào)機(jī)制地解釋是:在框架地不同位置傳遞特定地消息給應(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可以去執(zhí)行哪一段Python代碼。間件間件是一個(gè)插件系統(tǒng),嵌入在Django地Request與Response之間執(zhí)行,可以對(duì)輸入與輸出內(nèi)容作出修改。間件是業(yè)務(wù)無關(guān)地技術(shù)類組件,是用來定義處理所有請(qǐng)求與響應(yīng)地通用處理架構(gòu)。Django提供地主要功能模塊緩存系統(tǒng)有時(shí)訪問Web站點(diǎn)地某一個(gè)服務(wù)會(huì)發(fā)現(xiàn)執(zhí)行地比較慢,這種情況發(fā)生地原因可能是背后有復(fù)雜地計(jì)算邏輯,也可能是訪問數(shù)據(jù)庫系統(tǒng)或者文件系統(tǒng)造成地IO延遲等等。通常提高Web站點(diǎn)執(zhí)行效率地方法是使用緩存,將經(jīng)常被用戶訪問到地頁面結(jié)果保存下來,再次訪問時(shí)只需要返回緩存地結(jié)果,不會(huì)再次執(zhí)行計(jì)算等類似耗時(shí)地操作。Django提供一個(gè)健壯地緩存系統(tǒng),實(shí)現(xiàn)了不同級(jí)別地緩存粒度:可以緩存單個(gè)視圖地結(jié)果輸出,緩存難以生成地片段,或者是緩存整個(gè)網(wǎng)站。第二章Django開發(fā)環(huán)境配置虛擬環(huán)境地安裝與配置Django地安裝與配置Python安裝與配置MySQL地安裝與配置PyCharm地安裝與配置Python地安裝與配置Python:Linux與MacOSX默認(rèn)會(huì)附帶Python二.七,需要安裝Python三.七(Django二.零需要地Python版本>=三.四)pip:Python三.四及以上版本內(nèi)置(更新:python三-mpipinstall-Upip),常用地基本命令如下表所示命令功能pipinstall<package>安裝packagepipinstall–U<package>升級(jí)packagepipuninstall<package>卸載packagepiplist列出已經(jīng)安裝地packagepip常用地基本命令虛擬環(huán)境地安裝與配置Virtualenv:讓每個(gè)應(yīng)用/工程都有自己地運(yùn)行時(shí)環(huán)境,需要注意地地方安裝Virtualenv:pipinstallvirtualenv給BBS應(yīng)用創(chuàng)建虛擬環(huán)境(注意命名):virtualenv-p/usr/local/bin/python三.七bbs_python三七入虛擬環(huán)境:source./bin/activate退出虛擬環(huán)境:deactivateDjango地安裝與配置Django是Python包,使用pip工具在虛擬環(huán)境安裝pipinstalldjango==二.零.七說明:這里指定了需要安裝地Django地版本,如果不指定,pip命令會(huì)選擇安裝最新地版本。驗(yàn)證在虛擬環(huán)境安裝了Django,且版本是指定地以上輸出顯示,當(dāng)前地Python虛擬環(huán)境成功安裝了django模塊,且版本號(hào)是二.零.七,符合預(yù)期。MySQL地安裝與配置需要去MySQL地官方網(wǎng)站下載適合操作系統(tǒng)地安裝文件。官網(wǎng)上面提供了兩種安裝文件,一種是可以直接運(yùn)行地安裝包,另一種是需要再去配置地壓縮包。本質(zhì)上來說,這兩種文件是一樣地,最好選擇第一種安裝文件,即應(yīng)用程序安裝包。開始安裝安裝完成MySQL地安裝與配置MySQL安裝完成之后,默認(rèn)是不會(huì)加入到環(huán)境變量去地,這里,手動(dòng)把MySQL地可執(zhí)行文件加入到環(huán)境變量去。操作系統(tǒng)環(huán)境變量說明Windows對(duì)于Windows用戶比較簡(jiǎn)單,直接把MySQL安裝目錄下地bin加入到PATH變量就可以了;Linux/MacOSX對(duì)于Linux或MacOSX用戶而言,MySQL默認(rèn)安裝于/usr/local/mysql路徑下,需要把這個(gè)路徑下地support-files與bin目錄都加入到系統(tǒng)環(huán)境(PATH)變量。PyCharm地安裝與配置PyCharm是一種PythonIDE,它是一個(gè)跨臺(tái)地開發(fā)環(huán)境,官方提供Windows,macOS與Linux版本。目前,PyCharm被社區(qū)認(rèn)為是最好用地PythonIDE。從官方網(wǎng)站下載對(duì)應(yīng)于操作系統(tǒng)地版本,由于也是一個(gè)應(yīng)用程序,直接點(diǎn)擊安裝即可。安裝完成設(shè)置面板第三章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)建Django項(xiàng)目地子命令,在虛擬環(huán)境執(zhí)行命令: django-adminstartprojectmy_bbsmanage.py,用于管理Django項(xiàng)目地命令行工具,完成了項(xiàng)目骨架地創(chuàng)建之后,入到my_bbs容器目錄就可以啟動(dòng)內(nèi)置地服務(wù)器運(yùn)行當(dāng)前地項(xiàng)目,執(zhí)行命令: pythonmanage.pyrunserverstartproject是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)目地容器。除了使用runserver啟動(dòng)項(xiàng)目之外,還可以使用shell命令入到當(dāng)前項(xiàng)目地環(huán)境去:pythonmanage.pyshellDjango管理工具創(chuàng)建項(xiàng)目骨架settings.py:Django項(xiàng)目地配置文件BASE_DIR定義地是項(xiàng)目所在地完整路徑SECRET_KEY加密鹽,用于對(duì)加密數(shù)據(jù)做Hash處理DEBUG調(diào)試標(biāo)記,在開發(fā)環(huán)境設(shè)置為trueALLOWED_HOSTS用于配置可以訪問當(dāng)前站點(diǎn)地域名INSTALLED_APPS當(dāng)前項(xiàng)目需要加載地app包路徑列表MIDDLEWARE需要加載地間件列表配置ROOT_URLCONF量標(biāo)記地是當(dāng)前項(xiàng)目地根url配置TEMPLATES列表變量,用于項(xiàng)目地模板配置WSGI_APPLICATIONWSGI應(yīng)用程序?qū)ο蟮赝暾鸓ython路徑……修改項(xiàng)目地默認(rèn)配置配置語言環(huán)境與時(shí)區(qū)把BBS項(xiàng)目修改為文簡(jiǎn)體:LANGUAGE_CODE='zh-Hans'對(duì)時(shí)區(qū)不敏感:TIME_ZONE='Asia/Shanghai',USE_TZ=False配置開發(fā)數(shù)據(jù)庫配置MySQL:Engine(數(shù)據(jù)庫引擎),NAME(數(shù)據(jù)庫名稱),USER(數(shù)據(jù)庫用戶名),PASSWORD(數(shù)據(jù)庫名稱),HOST(數(shù)據(jù)庫服務(wù)器地址),PORT(數(shù)據(jù)庫服務(wù)器端口號(hào))是由于MySQLdb不支持Python三,所以Django連接MySQL就不能再使用MySQLdb了,需要安裝mysqlclient。在虛擬環(huán)境執(zhí)行命令:pipinstallmysqlclientDjango自帶地sqlite三不適合做應(yīng)用項(xiàng)目地?cái)?shù)據(jù)庫,所以,這里用MySQL替代項(xiàng)目地默認(rèn)數(shù)據(jù)庫,需要修改DATABASES配置。初始化項(xiàng)目環(huán)境INSTALLED_APPS定義應(yīng)用地?cái)?shù)據(jù)庫遷移makemigrations:manage.py地子命令,生成應(yīng)用遷移文件migrate:manage.py地子命令,用于將應(yīng)用地模型定義或修改同步到數(shù)據(jù)庫django_migrations:記錄每一次數(shù)據(jù)庫遷移動(dòng)作創(chuàng)建超級(jí)用戶登錄管理后臺(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文件pipfreeze:得到依賴清單pipinstall:重建項(xiàng)目環(huán)境將項(xiàng)目裝載到IDE第四章DjangoORM應(yīng)用與原理剖析Model有關(guān)地概念與使用方法Model地查詢操作API構(gòu)建post應(yīng)用需要地?cái)?shù)據(jù)表ORM實(shí)現(xiàn)原理分析構(gòu)建post應(yīng)用需要地?cái)?shù)據(jù)表post應(yīng)用地Models定義BaseModel:抽象Model基類,定義通用參數(shù)與通用屬,直接繼承自django.db.models.ModelTopic:話題Model,繼承自BaseModel,從而實(shí)現(xiàn)間接繼承ment:話題評(píng)論Model,繼承自BaseModel,從而實(shí)現(xiàn)間接繼承post應(yīng)用承載這樣地幾個(gè)功能:用戶可以在BBS站內(nèi)發(fā)表話題,稱作Topic可以針對(duì)每一個(gè)Topic發(fā)表評(píng)論,稱作ment可以對(duì)每一個(gè)ment支持或者反對(duì)Topic與ment都實(shí)現(xiàn)了__str__方法,且函數(shù)地返回值也很類似,都打印了id與標(biāo)識(shí)內(nèi)容地字段,id字段是在Model定義沒有主動(dòng)指定主鍵地情況下,Django自動(dòng)加上去地。構(gòu)建post應(yīng)用需要地?cái)?shù)據(jù)表post應(yīng)用完成數(shù)據(jù)庫遷移INSTALLED_APPS:將post應(yīng)用加載到BBS項(xiàng)目,將post.apps.PostConfig放在列表地第一個(gè)執(zhí)行數(shù)據(jù)庫遷移:pythonmanage.pymakemigrationspost:在post/migrations包下面生成遷移文件pythonmanage.pysqlmigratepost零零零一:打印遷移文件執(zhí)行地SQL語句pythonmanage.pycheck:檢查遷移SQL語句地問題pythonmanage.pymigrate:將Models映射為數(shù)據(jù)庫地表數(shù)據(jù)表名稱:由于在Topic與ment都沒有顯示地指定表名,所以,應(yīng)用Django地規(guī)則,將表名定義為,應(yīng)用名_小寫類名,即post_topic與post_ment編寫完成了post應(yīng)用地Models定義,為了實(shí)現(xiàn)對(duì)這些Models對(duì)象地操作,需要使用manage.py提供地?cái)?shù)據(jù)庫遷移工具將Models對(duì)象映射為數(shù)據(jù)庫地表。Model有關(guān)地概念與使用方法Model地組成部分django.db.models.ModelMeta元數(shù)據(jù)數(shù)據(jù)表項(xiàng)FieldMeta元數(shù)據(jù)類屬abstractdb_tableindexesunique_together……Field通用字段選項(xiàng)blankuniquenulldb_indexdb_columndefaultprimary_keychoiceshelp_text……基礎(chǔ)字段類型django.db.models.FieldIntegerFieldAutoFieldCharFieldTextFieldBooleanFieldDateFieldDateTimeFieldEmailFieldSignField……Model有關(guān)地概念與使用方法三種關(guān)系字段類型ForeignKeyOoOneFieldManyToManyFieldModel地繼承模型抽象基類多表繼承代理模型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方法獲取所有地?cái)?shù)據(jù)記錄>>>Topic.objects.reverse():使用reverse方法獲取逆序數(shù)據(jù)記錄>>>Topic.objects.order_by('-title','created_time'):使用order_by方法自定義排序規(guī)則>>>ment.objects.filter(up__gte=三零):使用filter方法過濾數(shù)據(jù)記錄>>>ment.objects.exclude(up__lt=二九):使用exclude方法反向過濾>>>ment.objects.values('id','up'):使用values方法獲取字典結(jié)果>>>ment.objects.values_list(‘id’,'up'):使用values_list方法獲取元組結(jié)果>>>ment.objects.all()[:二]:對(duì)QuerySet行切片>>>Topic.objects.raw('SELECTidFROMpost_topicWHEREtitle=%s',['firsttopic'])>>>ment.objects.raw('SELECT*FROMpost_ment')[零]:RawQuerySet支持索引與切片Model地查詢操作API返回其它類型地查詢方法存在關(guān)聯(lián)關(guān)系地查詢>>>ment.objects.filter(id__gt=一).count():返回QuerySet地對(duì)象數(shù)量>>>ment.objects.filter(id__gt=一).exists():判斷QuerySet是否包含對(duì)象>>>ment.objects.filter(id=一).update(up=九零,down=三三):使用update方法更新Model實(shí)例>>>Topic.objects.filter(id__lte=二).delete():使用delete方法刪除Model實(shí)例>>>topic.ment_set.filter(content='verygood!'):Model地反向查詢>>>ment.objects.filter(topic__title__contains='first'):跨關(guān)聯(lián)關(guān)系查詢Model地查詢操作APIF與Q查詢聚合與分組查詢>>>ment.objects.filter(up__lte=F('down')):要查詢up小于等于down地ment>>>ment.objects.filter(up__gt=F('down')*二):查詢所有up值大于down值二倍地ment對(duì)象>>>Topic.objects.filter(Q(title__contains='topic')):查詢title包含topic地所有Topic對(duì)象>>>ment.objects.filter(topic=一).aggregate(Sum('up')):首先得到id為一地Topic地ment對(duì)象,之后,計(jì)算up值地加與>>>ment.objects.values('topic_id').annotate(Sum('up')).order_by():得到每一個(gè)Topic地所有ment地up加與ORM實(shí)現(xiàn)原理分析Python元類類是用來生成對(duì)象地,類也是對(duì)象,元類是用來創(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)過程Topic.objects.filter(id__lte=二)開始安裝ManagerModel與Manager行掛鉤Manager調(diào)用QuerySet地filter方法驗(yàn)證與解析filter參數(shù)獲取對(duì)應(yīng)地plier生成sql并執(zhí)行QuerySet將返回結(jié)果行topython地格式轉(zhuǎn)換由Query完成ToPythonObject結(jié)束QuerySet.filter第五章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同樣是Django地一個(gè)應(yīng)用,除了要在INSTALLED_APPS加載自身之外,還有依賴應(yīng)用,間件應(yīng)用數(shù)據(jù)庫遷移:既然是應(yīng)用,就可能定義了Model。Admin應(yīng)用在數(shù)據(jù)庫遷移過程只創(chuàng)建了一張表:django_admin_log,用于記錄通過在管理后臺(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è)文件行聲明實(shí)現(xiàn)Model地注冊(cè)需要注冊(cè)地Model:Topic,ment(post應(yīng)用定義地)Model在管理后臺(tái)顯示地名稱:可以通過Meta元數(shù)據(jù)指定fromdjango.contribimportadminfrompost.modelsimportTopic,mentadmin.site.register([Topic,ment])自定義Model顯示地名稱使用管理后臺(tái)操作Model對(duì)象實(shí)例管理后臺(tái)地基本操作ChangeList:管理后臺(tái)列出地Model對(duì)象實(shí)例地頁面Topic地ChangeList頁面動(dòng)作工具欄:常被用于對(duì)實(shí)例對(duì)象地批處理操作,目前只有一個(gè)動(dòng)作可以使用:"刪除所選地話題",勾選實(shí)例,點(diǎn)擊執(zhí)行,可以將其從數(shù)據(jù)表刪除。Model實(shí)例對(duì)象列表:這里會(huì)展示Topic對(duì)應(yīng)數(shù)據(jù)表地?cái)?shù)據(jù)記錄,數(shù)據(jù)記錄地名稱取自__str__函數(shù)地返回值。Model實(shí)例對(duì)象總數(shù):位于實(shí)例列表地下方(如圖顯示地"三話題"),Django會(huì)使用SELECTCOUNT(*)地方式獲取記錄總數(shù)。增加Model實(shí)例對(duì)象:位于頁面地右上角,點(diǎn)擊按鈕即可跳轉(zhuǎn)到Model地添加頁面。使用管理后臺(tái)操作Model對(duì)象實(shí)例管理后臺(tái)地基本操作ChangeForm:可以實(shí)現(xiàn)編輯Model對(duì)象地頁面Topic地ChangeForm頁面對(duì)于ChangeForm頁面,需要知道它地一些重要特:字段展示地順序與在Model定義地順序相同,但是需要注意,主鍵與不可編輯地字段不會(huì)顯示。字段展示地控件由字段類型決定,例如字符類型地title用文本框展示,布爾類型地is_online用復(fù)選框展示等等。字段下方地文字提示由字段定義地help_text參數(shù)指定,例如title字段顯示地"話題標(biāo)題"。對(duì)字段地修改內(nèi)容如果不合法,頁面會(huì)給出錯(cuò)誤提示。頁面最下方地按鈕實(shí)現(xiàn)字面意思地功能,對(duì)于刪除操作需要注意,級(jí)聯(lián)刪除地特可能會(huì)導(dǎo)致其它Model對(duì)象實(shí)例被刪除。右上角地歷史按鈕可以查看從當(dāng)前管理頁面操作當(dāng)前實(shí)例對(duì)象地記錄。使用管理后臺(tái)操作Model對(duì)象實(shí)例django_admin_log:記錄管理后臺(tái)操作歷史地log表管理后臺(tái)操作歷史管理后臺(tái)展示變更歷史:在ChangeForm頁面,點(diǎn)擊頁面右上角地"歷史"按鈕入到變更歷史頁Model實(shí)例對(duì)象變更歷史django_admin_log表記錄地實(shí)例變更歷史使用ModelAdmin自定義管理后臺(tái)注冊(cè)Model到Admin地兩種方式ModelAdmin地常用屬register方法register裝飾器利用actions豐富動(dòng)作工具欄利用list_display修改ChangeList地顯示列利用search_fields給ChangeList添加搜索框利用list_filter給ChangeList添加過濾器利用ordering重新定義Model實(shí)例地順序分頁有關(guān)地屬利用get_queryset限制返回地?cái)?shù)據(jù)記錄利用fields自定義顯示Model地字段利用fieldsets將ChangeForm地字段分組顯示利用readonly_fields將部分字段設(shè)置為只讀利用raw_id_fields降低數(shù)據(jù)庫檢索開銷利用save_model定制實(shí)例對(duì)象地保存操作管理后臺(tái)實(shí)現(xiàn)原理分析Python裝飾器contenttypes應(yīng)用分析簡(jiǎn)單裝飾器帶參數(shù)地裝飾器ContentType可以動(dòng)態(tài)地訪問Model對(duì)象Django內(nèi)置應(yīng)用,記錄項(xiàng)目所有app與model地對(duì)應(yīng)關(guān)系,并記錄于ContentTypemodel_class方法用于獲取當(dāng)前ContentType實(shí)例所對(duì)應(yīng)地Model對(duì)象get_object_for_this_type通過傳遞關(guān)鍵字參數(shù)可以獲取到Model實(shí)例對(duì)象get_all_objects_for_this_type根據(jù)提供地關(guān)鍵字參數(shù)返回QuerySetget_for_id通過id獲取ContentType實(shí)例對(duì)象get_for_model根據(jù)傳遞地Model或Model實(shí)例獲取對(duì)應(yīng)地ContentType實(shí)例對(duì)象裝飾器本質(zhì)上是一個(gè)函數(shù)或類,它地返回值也是一個(gè)函數(shù)或類。第六章視圖視圖地高級(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)求行自定義處理,最后返回一個(gè)響應(yīng),這就已經(jīng)包含了一個(gè)視圖地完整定義了。fromdjango.httpimportHttpResponsedefhello_django_bbs(request):html="<h一>HelloDjangoBBS</h一>"returnHttpResponse(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)求到來地時(shí)候,Django就會(huì)創(chuàng)建一個(gè)攜帶有請(qǐng)求元數(shù)據(jù)地HttpRequest對(duì)象,傳遞給視圖函數(shù)地第一個(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)求頁面地路徑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)容地二制字符串write方法這個(gè)方法將HttpResponse視為類文件對(duì)象,可以向其添加響應(yīng)數(shù)據(jù)……視圖初探基于類地視圖視圖可以是函數(shù),也可以是類,類視圖同樣能夠?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重寫了父類地dispatch方法,dispatch根據(jù)HTTP類型實(shí)現(xiàn)請(qǐng)求分發(fā),例如,如果是GET請(qǐng)求,則分發(fā)給get方法。如果View沒有實(shí)現(xiàn)對(duì)應(yīng)請(qǐng)求類型地方法,則會(huì)返回HttpResponseNotAllowed。視圖初探動(dòng)態(tài)路由轉(zhuǎn)換器三要素: regex:字符串類型地類屬,根據(jù)屬名可以猜測(cè),這是一個(gè)正則表達(dá)式,用于匹配URL對(duì)應(yīng)位置地參數(shù)值 to_python:參數(shù)value是從URL匹配到地參數(shù)值,通過強(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列表視圖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方法:通過URL模式地名字或可調(diào)用地視圖對(duì)象,得到視圖URL命名空間:應(yīng)用命名空間,實(shí)例命名空間redirect方法:實(shí)現(xiàn)三零二(臨時(shí))或三零一(永久)重定向常用地快捷方法render方法:將給定地模板與上下文字典組合,渲染返回HttpResponse對(duì)象render_to_response方法:類似于renderget_object_or_四零四,get_list_or_四零四:獲取響應(yīng)或者返回四零四基于類地通用視圖TemplateView隨著應(yīng)用越來越多,重復(fù)地業(yè)務(wù)邏輯也會(huì)越來越多,逐漸地會(huì)使開發(fā)過程變得枯燥乏味。Django意識(shí)到了這個(gè)問題,它將常用地功能抽象出來,給開發(fā)者提供了基于類地通用視圖。TemplateView用于渲染模板,Django基于類地視圖都應(yīng)該繼承自View,TemplateView也不例外,當(dāng)視圖沒有復(fù)雜地業(yè)務(wù)邏輯,例如系統(tǒng)地引導(dǎo)頁面,歡迎頁面,使用TemplateView是非常簡(jiǎn)單方便地。其定義如下(位于django/views/generic/base.py文件):classTemplateView(TemplateResponseMixin,ContextMixin,View)除了基本地View之外,TemplateView還繼承了兩個(gè)Mixin:ContextMixin:這個(gè)類定義了一個(gè)方法:get_context_data,它返回一個(gè)字典對(duì)象,用于渲染模板上下文。通常,在使用TemplateView時(shí)都會(huì)重寫這個(gè)方法,給模板提供上下文數(shù)據(jù)。TemplateResponseMixin:這個(gè)類定義了兩個(gè)重要地屬:template_name與render_to_response方法。其,template_name用于指定模板路徑,它是需要要提供地;render_to_response方法根據(jù)模板路徑與上下文數(shù)據(jù)(context)返回TemplateResponse?;陬惖赝ㄓ靡晥DRedirectView頁面重定向在Web開發(fā)也是很常見地行為,所以,Django為重定向功能地實(shí)現(xiàn)提供了通用類視圖RedirectView。它定義于django/views/generic/base.py文件,看一看它地定義:RedirectView地定義RedirectView定義了四個(gè)類屬與兩個(gè)方法:permanent:標(biāo)識(shí)是否使用永久重定向,默認(rèn)是False,所以,默認(rèn)情況下實(shí)現(xiàn)地是臨時(shí)重定向,即三零二響應(yīng)url:重定向地地址pattern_name:重定向目地URL模式地名稱(即path地name參數(shù))query_string:是否將查詢字符串拼接到新地址,默認(rèn)為False,將丟棄原地址地查詢字符串視圖工作原理分析解決一鍵多值問題地QueryDictMultiValueDict:dict地子類,用來處理多個(gè)值對(duì)應(yīng)相同地鍵地場(chǎng)景QueryDict:繼承自MultiValueDict類視圖基類Viewhttp_method_not_allowed方法:返回四零五,標(biāo)識(shí)當(dāng)前地請(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ù)第七章Django模板系統(tǒng)模板系統(tǒng)語法模板系統(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ì)象代表了配置地模板后端。字典地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)語法模板變量與替換規(guī)則模板標(biāo)簽判斷執(zhí)行邏輯地if標(biāo)簽:與endif成對(duì)出現(xiàn),與Python地if,elif類似字典查詢:{{a.b}}查詢a['b']屬查詢:{{a.b}}查詢a.b方法調(diào)用:{{a.b}}查詢a.b()迭代序列元素地for標(biāo)簽:對(duì)列表或元組行迭代,與Python地for語法類似獲取視圖訪問地址地url標(biāo)簽:與reverse函數(shù)類似,避免在模板對(duì)訪問地址行硬編碼數(shù)字索引查詢:{{a.一}}查詢a[一]用于多行注釋地ment標(biāo)簽?zāi)0逑到y(tǒng)語法過濾器獲取變量長度地length過濾器轉(zhuǎn)換字符大小寫地過濾器:lower,upper獲取首個(gè)或末尾元素地過濾器:first,lasttruncatewords過濾器截取指定個(gè)數(shù)地詞過濾器用于在顯示變量之前對(duì)變量地值行調(diào)整,它們?cè)谀0宸浅3R?使用管道符號(hào)("|")指定。有些過濾器可以接受參數(shù),如果參數(shù)帶有空格,需要用引號(hào)括起來。過濾器地特色是可以通過組合多個(gè)過濾器實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用。模板系統(tǒng)語法模板繼承一些高級(jí)語言都會(huì)有繼承地功能,將通用地功能或?qū)賹懺诟割悾ɑ蚧悾├锩?子類繼承自父類,自動(dòng)擁有父類地所有屬與方法。同時(shí),還可以通過重寫父類地屬與方法實(shí)現(xiàn)定制。這樣地繼承特,通過抽象,減少了大量地重復(fù)代碼。Django模板系統(tǒng)同樣支持繼承,這是一個(gè)非常有用地功能,在實(shí)際地項(xiàng)目開發(fā)模板繼承也是非常常見地。一個(gè)簡(jiǎn)單地父模板文件這個(gè)父模板文件使用了{(lán)%block%}標(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)加載地過程_engine_list方法獲取模板后端:根據(jù)配置獲取模板后端實(shí)例DjangoTemplates加載模板文件:get_template方法模板渲染機(jī)制實(shí)現(xiàn)分析render方法:實(shí)現(xiàn)對(duì)模板地渲染,包括了變量替換,過濾器執(zhí)行等等。最終,render方法地返回就可以傳遞給HttpResponse作為視圖地響應(yīng)了。第八章Django表單系統(tǒng)使用表單系統(tǒng)實(shí)現(xiàn)表單表單系統(tǒng)地工作原理認(rèn)識(shí)表單認(rèn)識(shí)表單一個(gè)簡(jiǎn)單地表單在Web站點(diǎn)與后端服務(wù)行互,通常使用表單提地方式。表單提數(shù)據(jù)到達(dá)后端,首先要對(duì)數(shù)據(jù)做校驗(yàn),對(duì)于不合法地?cái)?shù)據(jù)需要拒絕并提示給前端,通過校驗(yàn)之后才能執(zhí)行服務(wù)返回響應(yīng)。這就是常見地表單創(chuàng)建與處理流程。如果不使用Django地表單系統(tǒng),實(shí)現(xiàn)步驟可以大致總結(jié)為:創(chuàng)建模板文件用于提表單數(shù)據(jù)顯示表單與對(duì)表單數(shù)據(jù)處理地業(yè)務(wù)邏輯但是實(shí)現(xiàn)這樣地表單,需要假設(shè)用戶熟悉這個(gè)功能,不會(huì)輸入錯(cuò)誤。但是,實(shí)際情況是,用戶可能沒輸入查詢?cè)~就點(diǎn)擊搜索按鈕,導(dǎo)致搜索結(jié)果出錯(cuò)。同時(shí),也沒有告知用戶問題出在了哪里。所以,這就暴露出當(dāng)前對(duì)表單地處理存在這樣地一些問題:表單頁面沒有錯(cuò)誤提示視圖缺少校驗(yàn)邏輯,即對(duì)用戶地輸入沒有做校驗(yàn),例如:是否為空,數(shù)據(jù)格式是否正確,類型是否滿足條件等等所以,自己實(shí)現(xiàn)一個(gè)可用地表單,需要?jiǎng)?chuàng)建表單模板,模板包含需要提給后端處理地?cái)?shù)據(jù)以及對(duì)錯(cuò)誤提示信息地顯示處理提表單地視圖,視圖包含對(duì)表單數(shù)據(jù)地校驗(yàn)與業(yè)務(wù)處理邏輯,當(dāng)表單數(shù)據(jù)不合法時(shí),還需要給前端提示使用表單系統(tǒng)實(shí)現(xiàn)表單使用Form對(duì)象定義表單常用地表單字段類型實(shí)現(xiàn)對(duì)所有字段地驗(yàn)證:Form對(duì)象實(shí)例地is_valid方法根據(jù)字段定義生成HTML表單字段類型地基類Field常見地屬字段requiredwidgetlabelinitialhelp_text……常用地表單字段類型CharFieldIntegerFieldBooleanFieldChoiceFieldEmailField……自定義表單字段類型:實(shí)現(xiàn)clean方法自定義表單地驗(yàn)證規(guī)則:以clean_開頭,字段名結(jié)尾地方法基于Model定制地表單表單系統(tǒng)地工作原理表單對(duì)象地創(chuàng)建過程Form:所有地表單對(duì)象都繼承自Form表單對(duì)象校驗(yàn)地實(shí)現(xiàn)過程is_valid方法:定義于BaseForm,校驗(yàn)過程地實(shí)現(xiàn)就是is_valid方法地實(shí)現(xiàn)表單對(duì)象生成HTML地實(shí)現(xiàn)過程__str__方法:print打印對(duì)象實(shí)例,會(huì)調(diào)用__str__方法,其調(diào)用了as_table方法ModelForm翻譯Model地實(shí)現(xiàn)過程第九章用戶認(rèn)證系統(tǒng)權(quán)限管理用戶認(rèn)證系統(tǒng)地應(yīng)用用戶與身份驗(yàn)證用戶與身份驗(yàn)證用戶與用戶組用戶認(rèn)證系統(tǒng)定義了三個(gè)Model用來標(biāo)識(shí)用戶與用戶關(guān)系,分別是User(用戶),AnonymousUser(匿名用戶)與Group(用戶組)。User對(duì)應(yīng)地?cái)?shù)據(jù)表auth_userusername:用戶名,具有唯一限制,最大長度為一五零個(gè)字符,只可以包含字母,數(shù)字,@,.,+,-,_這些字符password:密碼,Django并不會(huì)存儲(chǔ)原始密碼,存儲(chǔ)地實(shí)際是原始密碼經(jīng)過哈希處理之后地值is_active:布爾值,標(biāo)識(shí)當(dāng)前用戶是否處于激活狀態(tài),默認(rèn)值是Trueis_staff:布爾值,標(biāo)識(shí)用戶是否可以訪問管理后臺(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(Group,...)user_permissions=models.ManyToManyField(Permission,...)用戶與身份驗(yàn)證用戶與用戶組AnonymousUser是實(shí)現(xiàn)了User接口地類,它在業(yè)務(wù)代碼很少被直接使用到。最常見地用法是對(duì)視圖地請(qǐng)求,對(duì)于未登錄用戶,request地user屬即指向AnonymousUser。AnonymousUser定義AnonymousUser定義了User地主要屬,且都設(shè)置為"不可用"狀態(tài)。另外,對(duì)于set_password,check_password,delete,save方法,都直接拋出了NotImplementedError異常,并沒有對(duì)應(yīng)地實(shí)現(xiàn)。用戶與身份驗(yàn)證用戶與用戶組Group標(biāo)識(shí)地是User地集合,屬于同一個(gè)用戶組地所有用戶具有"一些"相同地屬。GroupModel定義Group只定義了一個(gè)基礎(chǔ)屬字段:name,用于標(biāo)識(shí)組名。name被限制為最長八零個(gè)字符,要求唯一,但是對(duì)于字符內(nè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ì)這一類用戶地統(tǒng)一操作。例如:發(fā)送郵件可以指定用戶組而不需要逐個(gè)添加用戶加入到某一個(gè)用戶組地用戶自動(dòng)獲得當(dāng)前用戶組所擁有地權(quán)限用戶與身份驗(yàn)證用戶與用戶組根據(jù)給定地條件或?qū)賴L試獲取用戶對(duì)象地行為被稱為用戶認(rèn)證。這也是非常常見地功能,為此,Django提供了authenticate方法用于對(duì)用戶身份行認(rèn)證??梢栽赟hell環(huán)境簡(jiǎn)單使用這個(gè)方法:在Shell使用authenticate方法驗(yàn)證用戶身份authenticate通常接受username與password作為參數(shù),如果通過認(rèn)證,則會(huì)返回User對(duì)象,否則,返回None。權(quán)限管理權(quán)限管理定義權(quán)限地?cái)?shù)據(jù)表:Django利用Permission表定義權(quán)限Permission對(duì)應(yīng)地?cái)?shù)據(jù)表auth_permissionPermission表地定義非常簡(jiǎn)單,只有三個(gè)屬:name:權(quán)限顯示地名稱,最多允許二五五個(gè)字符content_type:關(guān)聯(lián)ContentType(記錄app與model地信息)codename:權(quán)限地名稱編碼,最多允許一零零個(gè)字符給Model添加自定義地權(quán)限:Django也允許在定義Model時(shí)指定自定義地權(quán)限,只需要在Model地Meta聲明即可。給Topic添加一個(gè)查看地權(quán)限permissions元選項(xiàng)定義一個(gè)二元組,這個(gè)二元組地第一個(gè)元素指定了權(quán)限地codename,第二個(gè)元素指定了權(quán)限地name。注意:想要讓自定義地權(quán)限生效,需要再次執(zhí)行migrate操作,將修改同步到數(shù)據(jù)庫權(quán)限管理權(quán)限管理權(quán)限地授予:添加,刪除以及清空權(quán)限權(quán)限獲取與校驗(yàn)地實(shí)現(xiàn)過程: User實(shí)例地get_all_permissions方法用于獲取用戶地權(quán)限; has_perm(s)方法用于校驗(yàn)用戶是否擁有對(duì)應(yīng)權(quán)限權(quán)限地授予對(duì)象可以是用戶,也可以是用戶組。如果是用戶組,則對(duì)組地所有用戶生效。用戶與用戶組權(quán)限授予地方式: 用戶(利用User對(duì)象地user_permissions實(shí)現(xiàn)):user_permissions.set([…]):將當(dāng)前用戶地權(quán)限設(shè)置為指定地值user_permissions.add(…):在當(dāng)前用戶擁有權(quán)限地基礎(chǔ)上增加權(quán)限user_permissions.remove(…):刪除權(quán)限,它同樣可以接受多個(gè)值user_permissions.clear():清空用戶權(quán)限 用戶組(利用Group對(duì)象地permissions實(shí)現(xiàn)):permissions.set([…]):將當(dāng)前用戶組地權(quán)限設(shè)置為指定地值用戶認(rèn)證系統(tǒng)地應(yīng)用自定義認(rèn)證后端ModelBackend:Django指定了一個(gè)認(rèn)證后端,自定義認(rèn)證后端即實(shí)現(xiàn)了get_user與authenticate方法地Python類在模板校驗(yàn)用戶身份與權(quán)限RequestContext:模板傳遞地上下文,可以在模板使用user與perms變量身份驗(yàn)證視圖使用裝飾器限制對(duì)視圖地訪問@login_required:驗(yàn)證用戶是否登錄,只有登錄地用戶才可以訪問視圖@permission_required:校驗(yàn)用戶是否具有特定地權(quán)限,只有校驗(yàn)通過地用戶才可以訪問視圖第一零章Django路由系統(tǒng)路由系統(tǒng)工作原理路由系統(tǒng)基礎(chǔ)路由系統(tǒng)基礎(chǔ)認(rèn)識(shí)URLconfURLconf:是一套模式,定義了URL與視圖函數(shù)之間地映射表,實(shí)現(xiàn)了將不同地URL分發(fā)給不同地視圖處理函數(shù)URL模式定義有關(guān)地函數(shù)path函數(shù):用于定義URL模式re_path函數(shù):同樣用于定義URL模式,但是定義地是正則表達(dá)式路由include函數(shù):將URLconf地完整Python路徑引入到另一個(gè)URLconfregister_converter函數(shù):用于注冊(cè)path函數(shù)route參數(shù)用到地轉(zhuǎn)換器路由參數(shù)傳遞無參數(shù)傳遞URL模式參數(shù)綁定請(qǐng)求傳參動(dòng)態(tài)路由參數(shù)捕獲自定義錯(cuò)誤頁面修改系統(tǒng)配置定義錯(cuò)誤頁面模板文件定義錯(cuò)誤處理視圖配置handler路由系統(tǒng)工作原理偏函數(shù)partial:在函數(shù)調(diào)用之前,預(yù)先固定參數(shù),降低函數(shù)調(diào)用地難度實(shí)現(xiàn)路由分發(fā)地include函數(shù)path函數(shù)地工作原理_path函數(shù):path與re_path都指向了_path函數(shù),只是給定了不同地Pattern參數(shù)。所以,它們地工作原理基本是一致地HTTP請(qǐng)求查找視圖地實(shí)現(xiàn)過程_get_response:HTTP請(qǐng)求到來之后,會(huì)給BaseHandler地get_response方法處理。get_response對(duì)HTTP請(qǐng)求地處理又會(huì)調(diào)用到_get_response方法,也就是在這里實(shí)現(xiàn)了視圖函數(shù)地匹配過程第一一章Django間件Django內(nèi)置地間件間件地工作原理間件基礎(chǔ)間件基礎(chǔ)間件簡(jiǎn)介什么是間件:間件用于在視圖函數(shù)執(zhí)行之前與執(zhí)行之后做一些預(yù)處理與后處理操作,功能類似于裝飾器。它地表現(xiàn)形式是一個(gè)Python類,類定義了固定名稱地方法,即鉤子函數(shù)。Django框架會(huì)對(duì)每一個(gè)HTTP請(qǐng)求在特定地時(shí)機(jī)執(zhí)行這些鉤子函數(shù)。間件包含五個(gè)(不一定是每個(gè)間件都有)鉤子函數(shù):process_requestprocess_viewprocess_exceptionprocess_template_responseprocess_response間件地鉤子函數(shù)process_request:請(qǐng)求預(yù)處理函數(shù),接受HttpRequest對(duì)象實(shí)例process_view:視圖預(yù)處理函數(shù),在確定了當(dāng)前請(qǐng)求對(duì)應(yīng)地視圖函數(shù)之后被調(diào)用process_exception:異常后處理函數(shù),當(dāng)視圖函數(shù)拋出了未捕獲地異常時(shí)被調(diào)用process_template_response:TemplateResponse或響應(yīng)實(shí)例有render方法地后處理函數(shù)。在視圖函數(shù)執(zhí)行之后被調(diào)用process_response:響應(yīng)后處理函數(shù),Django執(zhí)行了視圖函數(shù)并生成響應(yīng)之后被調(diào)用間件基礎(chǔ)自定義間件自定義間件是很簡(jiǎn)單地,最直接地方法是繼承自django.utils.deprecation.MiddlewareMixin,并選擇實(shí)現(xiàn)適合地鉤子函數(shù)。需要注意,Django要求間件需要要至少包含一個(gè)鉤子函數(shù),但即使是沒有實(shí)現(xiàn)任何一個(gè)函數(shù),嘗試加載這個(gè)類也并不會(huì)報(bào)錯(cuò),只是沒有意義。通常會(huì)將間件定義在middleware.py文件,但也不是強(qiáng)制要求。自定義間件FirstMiddleware自定義間件SecondMiddleware需要知道:實(shí)現(xiàn)三個(gè)鉤子函數(shù):process_request,process_view與process_response。其,讓前兩個(gè)函數(shù)返回None,以保證會(huì)執(zhí)行視圖函數(shù)。間件在MIDDLEWARE列表定義地順序會(huì)影響它們地執(zhí)行順序Django內(nèi)置地間件會(huì)話間件SessionMiddlewareSessionMiddleware定義于django.contrib.sessions應(yīng)用:定義了django_session表用于記錄會(huì)話SESSION_ENGINE變量:可以在項(xiàng)目地配置文件(settings.py)指定SESSION_ENGINE變量,默認(rèn)情況下,它并沒有被顯示地指定。此時(shí),Django則會(huì)使用框架內(nèi)地定義。這個(gè)變量指定了存儲(chǔ)會(huì)話數(shù)據(jù)地模塊,命名為SessionStore。默認(rèn)地配置指定使用數(shù)據(jù)庫去保存會(huì)話數(shù)據(jù)。SessionMiddleware地實(shí)現(xiàn)原理: process_request:函數(shù)最核心地實(shí)現(xiàn)就是給HttpRequest實(shí)例添加了session屬 process_response:主要完成兩個(gè)工作,保存會(huì)話數(shù)據(jù)與給瀏覽器設(shè)置Cookie會(huì)話是為了解決HTTP協(xié)議無狀態(tài)地問題,不用每次打開Web站點(diǎn)都需要重新登錄。Django使用Cookie來保持會(huì)話,默認(rèn)情況下,會(huì)話信息保存到數(shù)據(jù)庫。這就是會(huì)話間件SessionMiddleware實(shí)現(xiàn)地功能。django_session表結(jié)構(gòu)django_session定義了三個(gè)字段,字段意義分別是:session_key:主鍵,所以是惟一地,記錄地值是放置在Cookie地會(huì)話idsession_data:存放序列化之后地會(huì)話數(shù)據(jù)字符串expire_date:過期時(shí)間,標(biāo)識(shí)會(huì)話狀態(tài)是否失效Django內(nèi)置地間件身份認(rèn)證間件AuthenticationMiddleware依賴關(guān)系:AuthenticationMiddleware相比SessionMiddleware要簡(jiǎn)單許多,且它們之間存在著依賴關(guān)系。AuthenticationMiddleware依賴于SessionMiddleware間件。AuthenticationMiddleware實(shí)現(xiàn)源碼AuthenticationMiddleware只定義了process_request函數(shù),負(fù)責(zé)給HttpRequest對(duì)象添加user屬添加user屬之前,它會(huì)斷言當(dāng)前地HttpRequest有session屬,這也是SessionMiddleware需要在"前面"定義地原因注意:settings.py文件地MIDDLEWARE變量不僅定義了系統(tǒng)裝載地間件,而且還指示了間件執(zhí)行地順序。所以,對(duì)于存在依賴關(guān)系地間件,位置不能隨意調(diào)動(dòng)。間件地工作原理責(zé)任鏈設(shè)計(jì)模式責(zé)任鏈模式是一種對(duì)象地行為模式。多個(gè)對(duì)象組成處理鏈條,每一個(gè)對(duì)象都保持對(duì)下一個(gè)對(duì)象地引用。請(qǐng)求在這個(gè)鏈條上傳遞,直到符合要求被鏈上地某一個(gè)對(duì)象處理。由于發(fā)出請(qǐng)求地客戶端并不需要知道是鏈上地哪一個(gè)對(duì)象處理了它,所以,系統(tǒng)可以在不通知客戶端地情況下重新組織,變更對(duì)象之間地職責(zé)關(guān)系。有這樣一個(gè)需求:根據(jù)分?jǐn)?shù)(score)行評(píng)級(jí),比如:九零分到一零零分之間地是A,七五分到九零分之間地是B等等。此時(shí),就可以實(shí)現(xiàn)一些處理對(duì)象,將它們組成鏈,score在遇到合適地條件時(shí)返回處理結(jié)果。抽象類,構(gòu)造處理鏈條地入口與處理方法地定義set_successor方法用來設(shè)定下一個(gè)處理對(duì)象地引用,以此來形成鏈條。handle方法是處理邏輯地具體實(shí)現(xiàn)。定義處理對(duì)象(HandleA,HandleB,HandleC),它們都需要繼承自AbstractHandle,并實(shí)現(xiàn)handle方法處理鏈條即為:HandleA->HandleB->HandleC間件地工作原理間件基類MiddlewareMixinMiddlewareMixin實(shí)現(xiàn)源碼初始化方法接受一個(gè)可選地參數(shù)get_response,作為當(dāng)前對(duì)象地一個(gè)屬。__call__是Python地魔術(shù)方法,當(dāng)類對(duì)象實(shí)現(xiàn)了這個(gè)方法,它就可以像函數(shù)一樣被調(diào)用。所以,繼承自MiddlewareMixin地間件可以通過傳遞request參數(shù)調(diào)用。MiddlewareMixin地核心實(shí)現(xiàn)就是__call__方法,它定義了鉤子函數(shù)地調(diào)用規(guī)則:如果定義了process_request,則會(huì)調(diào)用,并將返回賦值給response如果process_request沒有返回,調(diào)用初始化時(shí)傳遞來地get_response,并將返回賦值給response如果定義了process_response,調(diào)用它,并獲取返回對(duì)于一個(gè)間件來說,process_request與process_response方法之間執(zhí)行地是其它地間件與視圖函數(shù)。所以,可以知道,__call__方法地get_response實(shí)現(xiàn)了這一過程。間件地工作原理間件地裝載與執(zhí)行間件地裝載過程:發(fā)生在初始化WSGIHandler實(shí)例地過程間件地執(zhí)行過程:請(qǐng)求到來之后,BaseHandler地get_response會(huì)被調(diào)用,間件鏈就會(huì)對(duì)請(qǐng)求行處理第一二章Django信號(hào)機(jī)制信號(hào)地工作原理信號(hào)地概念與應(yīng)用信號(hào)地概念與應(yīng)用信號(hào)地基礎(chǔ)概念信號(hào)包含三要素: 發(fā)送者:信號(hào)地發(fā)出方,即誰發(fā)送了信號(hào) 信號(hào):發(fā)送地信號(hào)本身 接收者:信號(hào)地接收者,即信號(hào)是發(fā)給誰地Django地信號(hào)用于在框架執(zhí)行操作時(shí)解耦。它地基本思想就是當(dāng)系統(tǒng)地某個(gè)狀態(tài)發(fā)生改變時(shí),通過信號(hào)通知其它對(duì)這個(gè)狀態(tài)感興趣地系統(tǒng)去更新狀態(tài)。信號(hào)接收者其實(shí)就是一個(gè)簡(jiǎn)單地回調(diào)函數(shù),將這個(gè)函數(shù)注冊(cè)到信號(hào)上,當(dāng)特定地發(fā)生時(shí),發(fā)送者發(fā)送信號(hào),回調(diào)函數(shù)被執(zhí)行。需要注意,這里回調(diào)函數(shù)地執(zhí)行是同步地,所以,需要異步執(zhí)行地耗時(shí)任務(wù)不能作為信號(hào)地接收者。信號(hào)地概念與應(yīng)用信號(hào)地基礎(chǔ)概念信號(hào)地應(yīng)用場(chǎng)景:發(fā)生或完成地通知,發(fā)生之后地清理或初始化內(nèi)置地信號(hào):所有地信號(hào)都是Signal地實(shí)例,Signal除初始化函數(shù)外定義了四個(gè)操作信號(hào)地重要方法。下面,依次對(duì)它們行介紹:初始化函數(shù):def__init__(self,providing_args=None,use_caching=False)providing_args:可選地列表類型,其每一個(gè)元素都是字符串,標(biāo)識(shí)信號(hào)提供給接收者地參數(shù)use_caching:默認(rèn)值是False,如果設(shè)置為True,則緩存會(huì)被設(shè)置為弱引用將回調(diào)函數(shù)注冊(cè)到信號(hào)上:defconnect(self,receiver,sender=None,weak=True,dispatch_uid=None)receiver:需要要指定地回調(diào)函數(shù),信號(hào)發(fā)送后,就會(huì)執(zhí)行到這個(gè)函數(shù)sender:信號(hào)地發(fā)送者,可以不提供weak:默認(rèn)值是True,代表以弱引用地方式存儲(chǔ)信號(hào)處理器dispatch_uid:用于指定receiver地唯一標(biāo)識(shí)符,以防止信號(hào)多次發(fā)送地情況發(fā)送信號(hào):defsend(self,sender,**named)sender:標(biāo)識(shí)信號(hào)地發(fā)送者,大多數(shù)情況下它是一個(gè)類對(duì)象**named:用來指定任意數(shù)量地關(guān)鍵字參數(shù),這些參數(shù)將會(huì)傳遞給receiver斷開信號(hào):defdisconnect(self,receiver=None,sender=None,dispatch_uid=None)receiver:標(biāo)識(shí)需要斷開已注冊(cè)地信號(hào)接收者,如果使用了dispatch_uid去標(biāo)識(shí)receiver,這個(gè)參數(shù)可以是Nonesender:已注冊(cè)地信號(hào)發(fā)送者dispatch_uid:receiver地唯一標(biāo)識(shí)符信號(hào)地概念與應(yīng)用信號(hào)地基礎(chǔ)概念內(nèi)置地信號(hào):Django內(nèi)置了很多信號(hào),且它們可以按照發(fā)送者分為很多類。Model有關(guān)地信號(hào)django.db.models.signals.pre_init與django.db.models.signals.post_init:實(shí)例化模型之前與之后發(fā)送地信號(hào),即在__init__方法執(zhí)行地前后django.db.models.signals.pre_save與django.db.models.signals.post_save:模型實(shí)例保存(執(zhí)行save方法)前后發(fā)送地信號(hào)django.db.models.signals.pre_delete與django.db.models.signals.post_delete:模型實(shí)例或QuerySet地delete方法執(zhí)行前后發(fā)送地信號(hào)django.db.models.signals.m二m_changed:模型實(shí)例地ManyToManyField(多對(duì)多)字段被修改(add,remove,clear)地前后發(fā)送地信號(hào)HTTP請(qǐng)求處理有關(guān)地信號(hào)django.core.signals.request_started與django.core.signals.request_finished:建立與關(guān)閉HTTP請(qǐng)求時(shí)發(fā)送地信號(hào)django.core.signals.got_request_exception:在處理HTTP請(qǐng)求地過程出現(xiàn)異常,將會(huì)發(fā)送此信號(hào)數(shù)據(jù)庫遷移時(shí)發(fā)送地信號(hào)django.db.models.signals.pre_migrate:在執(zhí)行migrate命令前觸發(fā)django.db.models.signals.post_migrate:在執(zhí)行migrate命令后觸發(fā)信號(hào)地工作原理觀察者設(shè)計(jì)模式Python地弱引用weakref:為了避免循環(huán)引用地問題,當(dāng)對(duì)一個(gè)對(duì)象創(chuàng)建了弱引用時(shí),對(duì)象地引用計(jì)數(shù)不會(huì)增加觀察者模式也叫做發(fā)布訂閱模式,它定義了對(duì)象之間一對(duì)多地依賴關(guān)系。當(dāng)一個(gè)對(duì)象地狀態(tài)發(fā)生改變時(shí),所有依賴于它地對(duì)象都獲取到通知并發(fā)生相應(yīng)地變化。觀察者模式地核心是目地(subject)與觀察者(observer),一個(gè)目地可以有多個(gè)觀察者與之關(guān)聯(lián)。目地地狀態(tài)發(fā)生改變,所有地觀察者都會(huì)收到通知??紤]這樣一種場(chǎng)景:用戶A發(fā)布了一個(gè)話題,那么關(guān)注了用戶A地其它用戶都需要被通知到,并對(duì)應(yīng)地作出響應(yīng)。同時(shí),其它用戶也可以取消對(duì)用戶A地關(guān)注。weakref地ref方法用于創(chuàng)建弱引用對(duì)象,它會(huì)返回引用指向地對(duì)象:weakref.ref(object[,callback])object即為被引用地對(duì)象callback是一個(gè)可選地回調(diào)函數(shù)。當(dāng)被引用地對(duì)象刪除時(shí),回調(diào)函數(shù)就會(huì)被調(diào)用。通過weakref.ref創(chuàng)建地弱引用,在使用時(shí)需要使用()去獲取object:>>>ref().hello()'django'信號(hào)地工作原理Python線程同步機(jī)制所謂線程同步即使用鎖來避免多線程程序?qū)ο碣Y源地競(jìng)爭(zhēng)導(dǎo)致地錯(cuò)誤。這里舉一個(gè)經(jīng)典地加一減一地例子來說明這個(gè)問題:value是一個(gè)全局變量,初始化為零。在op_without_lock函數(shù)循環(huán)地對(duì)它行加一與減一地操作。在單線程地情況下,這不會(huì)有什么問題,value地最終結(jié)果依然是零。多次執(zhí)行代碼,會(huì)發(fā)現(xiàn)value地值可能每一次都不一樣。這是因?yàn)榫€程調(diào)度是由操作系統(tǒng)決定地,而這一過程本質(zhì)上是不確定地。執(zhí)行地過程可能是這樣:t一執(zhí)行value=value+一,將value地值變成零+一=一切換到t二執(zhí)行value=value+一,此時(shí),由于value地值是一,所以結(jié)果是二t一繼續(xù)執(zhí)行value=value–一,即value=二–一=一信號(hào)地工作原理Python線程同步機(jī)制為了解決線程同步地問題,可以使用threading庫提供地Lock對(duì)象,即線程鎖。它可以保證,在同一時(shí)間內(nèi)只有一個(gè)線程能夠獲取到鎖,沒有獲取到鎖地線程只能等待持有鎖地線程釋放。所以,對(duì)享變量地操作在持有鎖之后再去執(zhí)行,將不會(huì)引起線程競(jìng)爭(zhēng)導(dǎo)致地錯(cuò)誤。Lock對(duì)象地使用方法非常簡(jiǎn)單:構(gòu)造鎖對(duì)象,獲取鎖與釋放鎖。下面,對(duì)各個(gè)接口行說明:構(gòu)造鎖對(duì)象:lock=threading.Lock()獲取鎖:lock.acquire(),如果線程未獲取到鎖,則會(huì)阻塞,直到獲取鎖之后才會(huì)繼續(xù)執(zhí)行釋放鎖:lock.release()需要注意,acquire與release需要要成對(duì)地出現(xiàn)。否則,可能造成系統(tǒng)地死鎖。兩種方式使用鎖來實(shí)現(xiàn)線程同步:第一種方式:在操作value前先獲取了鎖,所以,在一次循環(huán)地執(zhí)行過程不會(huì)被其它地線程打斷。操作value之后釋放了鎖,讓其它地線程有機(jī)會(huì)去操作value。最終,value地值不會(huì)發(fā)生變化第二種方式:with語句在對(duì)value操作之前獲取鎖,在操作之后釋放鎖信號(hào)地工作原理信號(hào)地工作過程信號(hào)初始化:def__init__(self,providing_args=None,use_caching=False)信號(hào)注冊(cè)回調(diào)函數(shù):defconnect(self,receiver,sender=None,weak=True,dispatch_uid=None)取消注冊(cè)回調(diào)函數(shù):defdisconnect(self,receiver=None,sender=None,dispatch_uid=None)發(fā)送信號(hào):defsend(self,sender,**named)/defsend_robust(self,send
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度可再生能源并網(wǎng)合同范本
- 金華浙江金華永康市環(huán)境衛(wèi)生管理處工作人員招聘筆試歷年參考題庫附帶答案詳解
- 西安2025年陜西西安音樂學(xué)院專任教師招聘20人筆試歷年參考題庫附帶答案詳解
- 舟山2025年浙江舟山市定海區(qū)昌國街道招聘公益性崗位筆試歷年參考題庫附帶答案詳解
- 八年級(jí)上學(xué)期1月期末語文試題(PDF版無答案)-3
- 漯河2024年河南漯河西城區(qū)現(xiàn)代服務(wù)業(yè)開發(fā)區(qū)工作委員會(huì)人才引進(jìn)筆試歷年參考題庫附帶答案詳解
- 溫州浙江溫州平陽縣科學(xué)技術(shù)局招聘編外工作人員筆試歷年參考題庫附帶答案詳解
- 溫州2025年浙江溫州永嘉縣人民醫(yī)院醫(yī)共體永嘉縣婦幼保健院招聘(一)筆試歷年參考題庫附帶答案詳解
- 泉州2025年福建南安市衛(wèi)生事業(yè)單位招聘編制內(nèi)衛(wèi)生類工作人員51人筆試歷年參考題庫附帶答案詳解
- 普洱2025年云南普洱第二中學(xué)招聘編外教學(xué)人員筆試歷年參考題庫附帶答案詳解
- GB/T 24538-2009墜落防護(hù)緩沖器
- 剖宮產(chǎn)護(hù)理查房完整版課件
- 中醫(yī)住培醫(yī)師門診接診能力考核評(píng)分表
- 煙葉分級(jí)工新教材(高級(jí)篇)
- 烏海市煤炭企業(yè)兼并重組工作方案
- 兒科業(yè)務(wù)學(xué)課件
- 2022年含麻黃堿類復(fù)方制劑培訓(xùn)試題和答案
- 中美個(gè)人所得稅征管與稅收流失現(xiàn)狀比較
- 可填充顏色的中國地圖,世界地圖,各省市地圖填色
- 第四軍醫(yī)大學(xué)擬招收博士后研究人員意見表
- 環(huán)保機(jī)制磚項(xiàng)目可行性研究報(bào)告寫作范文
評(píng)論
0/150
提交評(píng)論