




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1第8章 python網(wǎng)站開發(fā)2本章重點(diǎn)難點(diǎn)本章重點(diǎn)MVC模式的概念及相關(guān)術(shù)語Django框架的模式Django環(huán)境的搭建與數(shù)據(jù)庫的配置Django框架的應(yīng)用本章難點(diǎn)MVC模式的概念Django環(huán)境的搭建Django框架的應(yīng)用38.1 常見的Web開發(fā)框架8.1.1 Zope框架Zope是免費(fèi)的,可以在開放源代碼許可證條件下自由分發(fā)。Zope是一套完整的平臺(tái),它包含了開發(fā)應(yīng)用程序所需的全部組件。允許第三方開發(fā)者打包和分發(fā)應(yīng)用程序。允許開發(fā)者只使用瀏覽器就可以創(chuàng)建Web應(yīng)用程序。提供多種可擴(kuò)展的安全框架,可以運(yùn)行在大多數(shù)計(jì)算機(jī)操作系統(tǒng)平臺(tái)中。8.1.2 TurboGears框架不用安裝Apach
2、e網(wǎng)頁服務(wù)器就可以開始開發(fā)網(wǎng)頁應(yīng)用程序。不用安裝數(shù)據(jù)庫MySQL/ PostgreSQL就可以開發(fā)數(shù)據(jù)庫網(wǎng)站。方便的布署能力,有眾多插件 (Extension) 支援。內(nèi)建網(wǎng)頁服務(wù)器,ORM、AJAX能力,默認(rèn)可以產(chǎn)生html、json格式。可擴(kuò)充的網(wǎng)頁接口的工具箱(ToolBox),內(nèi)含資料模型設(shè)計(jì)工具(Model Designer),資料編輯工具 (Catwalk),網(wǎng)站多國語言化工具等。48.1.3 Django框架1. Django的歷史2003開始時(shí),由Adrian Holovaty和Simon Willison將其作為勞倫斯雜志-世界報(bào)紙的一個(gè)內(nèi)部項(xiàng)目。2005將其命名為Djang
3、o發(fā)布于2005年7月。2008年9月發(fā)布了第一個(gè)正式版本1.0。當(dāng)前,Django是由世界各地的貢獻(xiàn)者來開發(fā)的一個(gè)開源項(xiàng)目。2. Django的設(shè)計(jì)理念(1) 松耦合:Django的目的是使其堆棧中的每個(gè)元素獨(dú)立于其他。(2) 較少編碼:較少代碼,所以能迅速的開發(fā)。5(3) 不必再重復(fù)(DRY):一切都應(yīng)只在一個(gè)地方,而不是一次又一次地重復(fù)來開發(fā)它。(4) 更快的開發(fā):Django的理念是盡一切所能,便于超高速開發(fā)。(5) 干凈的設(shè)計(jì):Django嚴(yán)格維護(hù)一個(gè)干凈的設(shè)計(jì)在其自己的代碼,并可以很容易地遵循最佳Web開發(fā)實(shí)踐。3.Django的優(yōu)勢(shì)(1) 對(duì)象關(guān)系映射(ORM)支持:Django
4、提供數(shù)據(jù)模型和數(shù)據(jù)庫引擎之間的橋梁,并支持大量的數(shù)據(jù)庫系統(tǒng),包括MySQL、Oracle、Postgres等等。在Django中還支持通過Django-nonrel支持NoSQL數(shù)據(jù)庫。(2) 多種語言支持:Django通過其內(nèi)置的國際化系統(tǒng)支持多語種網(wǎng)站。6(3) 框架支持:Django內(nèi)置了對(duì)Ajax、RSS、緩存和其他各種框架的支持。(4) 管理GUI:Django提供用于管理活動(dòng)的一個(gè)很好的用戶界面。(5) 開發(fā)環(huán)境:Django自帶了一個(gè)輕量級(jí)的Web服務(wù)器,方便終端到終端應(yīng)用的開發(fā)和測(cè)試。78.2 MVC模式MVC是三個(gè)單詞的縮寫,分別為:模型(Model)、視圖(View)和控制
5、(Controller)。 MVC模式的目的就是實(shí)現(xiàn)Web系統(tǒng)的職能分工。1. 視圖視圖是用戶看到并與之交互的界面。對(duì)老式的Web應(yīng)用程序來說,視圖就是由HTML元素組成的界面。在新式的Web應(yīng)用程序中,它還包括Macromedia Flash和XHTML,XML/XSL,WML等一些標(biāo)識(shí)語言和Web services。2. 模型模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。在MVC的三個(gè)部件中,模型擁有最多的處理任務(wù)。例如它可能用象EJBs和ColdFusion Components這樣的構(gòu)件對(duì)象來處理數(shù)據(jù)庫。被模型返回的數(shù)據(jù)是中立的,就是說模型與數(shù)據(jù)格式無關(guān),這樣一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù)。由于應(yīng)用于模型
6、的代碼只需寫一次就可以被多個(gè)視圖重用,所以減少了代碼的重復(fù)性。3. 控制器控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求。所以當(dāng)單擊Web頁面中的超鏈接和發(fā)送HTML表單時(shí),控制器本身不輸出任何東西和做任何處理。它只是接收請(qǐng)求并決定調(diào)用哪個(gè)模型構(gòu)件去處理請(qǐng)求,然后再確定用哪個(gè)視圖來顯示返回的數(shù)據(jù)。8.2.2 MVC模式的優(yōu)缺點(diǎn)1. 低耦合性視圖層和業(yè)務(wù)層分離,這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼,同樣,一個(gè)應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需要改動(dòng)MVC的模型層即可。因?yàn)槟P团c控制器和視圖相分離,所以很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。2. 高重用性和可適用性隨著技術(shù)
7、的不斷進(jìn)步,現(xiàn)在需要用越來越多的方式來訪問應(yīng)用程序。MVC模式允許使用各種不同樣式的視圖來訪問同一個(gè)服務(wù)器端的代碼。它包括任何WEB(HTTP)瀏覽器或者無線瀏覽器(WAP),比如,用戶可以通過電腦也可通過手機(jī)來訂購某樣產(chǎn)品,雖然訂購的方式不一樣,但處理訂購產(chǎn)品的方式是一樣的。由于模型返回的數(shù)據(jù)沒有進(jìn)行格式化,所以同樣的構(gòu)件能被不同的界面使用。例如,很多數(shù)據(jù)可能用HTML來表示,也有可能用WAP來表示,而這些表示所需要的命令是改變視圖層的實(shí)現(xiàn)方式,而控制層和模型層無需做任何改變。3. 較低的生命周期成本MVC使開發(fā)和維護(hù)用戶接口的技術(shù)含量降低成為可能。4. 快速的部署使用MVC模式使開發(fā)時(shí)間得
8、到相當(dāng)大的縮減,它使程序員集中精力于業(yè)務(wù)邏輯,界面程序員(HTML和JSP開發(fā)人員)集中精力于表現(xiàn)形式上。5. 可維護(hù)性分離視圖層和業(yè)務(wù)邏輯層也使得WEB應(yīng)用更易于維護(hù)和修改。6.有利于軟件工程化管理由于不同的層各司其職,每一層不同的應(yīng)用具有某些相同的特征,有利于通過工程化、工具化管理程序代碼。MVC模式的缺點(diǎn)體現(xiàn)在以下幾個(gè)方面:(1) 增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性:對(duì)于簡(jiǎn)單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,會(huì)增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的更新操作,降低運(yùn)行效率。(2) 視圖與控制器間的過于緊密的連接:視圖與控制器是相互分離又緊密聯(lián)系的部件,視圖沒有控制器的存在,其應(yīng)用是很
9、有限的,反之亦然,這樣妨礙了他們的獨(dú)立重用。(3) 視圖對(duì)模型數(shù)據(jù)的低效率訪問:依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對(duì)未變化數(shù)據(jù)的不必要的頻繁訪問,也將損害操作性能。8.2.3 Django框架中的MVCDjango緊緊地遵循MVC模式,是一種MVC框架。以下是Django中M、V、C各自的含義:M:數(shù)據(jù)存取部分,由django數(shù)據(jù)庫層處理。V:選擇顯示哪些數(shù)據(jù)要顯示以及怎樣顯示的部分,由視圖和模板處理。C:根據(jù)用戶輸入委派視圖的部分,由Django框架根據(jù)URLconf設(shè)置,對(duì)給定URL調(diào)用適當(dāng)?shù)腜ython函數(shù)。由于在Django中,控制器接受用戶輸入的部分
10、由框架自行處理,而Django更關(guān)注的是模型(Model)、模板(Template)和視圖(Views),Django也被稱為MTV框架。在MTV開發(fā)模式中:M :代表模型(Model),即數(shù)據(jù)存取層。該層處理與數(shù)據(jù)相關(guān)的所有事務(wù):如何存取、如何驗(yàn)證有效性、包含哪些行為以及數(shù)據(jù)之間的關(guān)系等。T: 代表模板(Template),即表現(xiàn)層。該層處理與表現(xiàn)相關(guān)的決定:如何在頁面或其他類型文檔中進(jìn)行顯示。V: 代表視圖(View),即業(yè)務(wù)邏輯層。該層包含存取模型及調(diào)取恰當(dāng)模板的相關(guān)邏輯。可以把它看作模型與模板之間的橋梁。如圖8- 2所示。需要注意的是,不能簡(jiǎn)單的把Django視圖認(rèn)為是MVC控制器,把
11、Django模板認(rèn)為MVC視圖。區(qū)別在于:Django視圖不處理用戶輸入,而僅僅決定要展現(xiàn)哪些數(shù)據(jù)給用戶;Django模板僅僅決定如何展現(xiàn)Django視圖指定的數(shù)據(jù)??梢哉J(rèn)為Django將MVC中的視圖進(jìn)一步分解為Django視圖和Django模板兩個(gè)部分,分別決定“展現(xiàn)哪些數(shù)據(jù)”和“如何展現(xiàn)”。MVC控制器部分,由Django框架的URLconf來實(shí)現(xiàn)。URLconf設(shè)計(jì)非常巧妙,其機(jī)制是使用正則表達(dá)式匹配URL,然后調(diào)用合適的Python函數(shù)。8.3 Django開發(fā)環(huán)境的搭建8.3.1 Django框架的安裝1. 安裝PythonDjango是用100%純Python代碼編寫,所以需要在
12、系統(tǒng)上安裝Python。Django1.9的版本需要2.7.3或高于2.7.x的版本,本教程中使用的是Python3.4和Django-1.9.1。Django與Python版本對(duì)應(yīng)關(guān)系如表8-1所示。2. 安裝DjangoPython是一種與平臺(tái)無關(guān)的語言,Django是一個(gè)Python Web框架,與操作系統(tǒng)無關(guān)。所以,Django的安裝是很容易的,但安裝步驟取決于所在的操作系統(tǒng)。UNIX/Linux和Mac OS X安裝如果計(jì)算機(jī)上運(yùn)行的是Linux或Mac OS系統(tǒng),那么可以有兩種方式來安裝Django:對(duì)于可以使用包管理器的操作系統(tǒng),可以使用easy_install或pip安裝;或者
13、手動(dòng)安裝下載的官方壓縮包。例如:手動(dòng)下載了類似這樣Djangox.xx.tar.gz壓縮包,其安裝命令如下:$ tar xzvf Django-x.xx.tar.gz$ cd Django-x.xx$ sudo python setup.py install安裝后,可以通過運(yùn)行下面的命令來測(cè)試安裝是否成功。$ django-admin.py -version如果看到打印在屏幕上的當(dāng)前Django版本,那么說明一切都設(shè)置好了。Windows安裝在Windows系統(tǒng)下,首先在Django官網(wǎng)上下載 Django-1.9.1.zip,解壓縮該文件。然后在解壓文件夾下輸入以下命令來完成Django 1
14、.9的安裝。命令格式如下:python setup.py installDjango完成安裝后,顯示Finished processing dependencies for Django1.9.1,標(biāo)志著Django的安裝完畢。結(jié)果如圖8-3所示。圖8-3 Django安裝成功圖8-4 Django安裝測(cè)試測(cè)試Django是否安裝成功,可以打開 Python Shell(IDLE (Python GUI)),Python Shell交互以“”開始,使用下邊的命令來查看Django 1.9安裝是否成功。如圖8-4顯示。Django框架安裝到python文件夾下的site-packages文件夾中
15、。3. 數(shù)據(jù)庫和Web服務(wù)器安裝(1) 數(shù)據(jù)庫安裝Django支持幾種主要的數(shù)據(jù)庫引擎,用戶可以根據(jù)需要,選擇安裝相應(yīng)的數(shù)據(jù)庫。MySQL (/)PostgreSQL (/)SQLite 3 (/)Oracle (/)MongoDb ()其中SQLite3數(shù)據(jù)庫已經(jīng)集成在Python3.4中了,該數(shù)據(jù)庫不需要安裝,可以直接使用。本書中使用Mysql數(shù)據(jù)庫進(jìn)行Web的開發(fā)。(2) Web服務(wù)器安裝Django自帶了一個(gè)輕量級(jí)的Web服務(wù)器,可用于開發(fā)和測(cè)試應(yīng)用程序。但該服務(wù)器僅用于應(yīng)用程序測(cè)試,不能發(fā)布Web應(yīng)用程序。Django支持Apache和其他流行的Web服務(wù)器,要發(fā)布開發(fā)的網(wǎng)站,需要使
16、用Apache服務(wù)器。安裝Apache服務(wù)器后,要使Apache支持Python,需要模塊mod_wsgi的支持,該模塊可以從mod_wsgi官網(wǎng)/pypi/mod_wsgi/下載。(3) Wamp集成環(huán)境的安裝數(shù)據(jù)庫和Web服務(wù)器的安裝,也可以使用現(xiàn)有的集成開發(fā)環(huán)境,例如:wamp、xampp等,這些集成開發(fā)環(huán)境中包含Apache服務(wù)軟件、Mysql數(shù)據(jù)庫軟件等。本書中采用的是集成開發(fā)環(huán)境PyCharm、數(shù)據(jù)庫采用Mysql。8.3.2 Django簡(jiǎn)單應(yīng)用例8-1】編寫一個(gè)簡(jiǎn)單的網(wǎng)頁,顯示“當(dāng)前時(shí)間”及“大家好!,歡迎使用Python”(1) 打開PyCharm,新建一個(gè)django的項(xiàng)目
17、,文件的位置可以隨意。這里命名為mysite,輸入項(xiàng)目的應(yīng)用名:mysiteapp,創(chuàng)建一個(gè)Django項(xiàng)目。如圖8-5所示。圖8-5 創(chuàng)建Django項(xiàng)目圖8-6 Django項(xiàng)目文件結(jié)構(gòu)圖8-7 啟動(dòng)自帶的測(cè)試服務(wù)器(2)驗(yàn)證項(xiàng)目是否正常進(jìn)入項(xiàng)目mysite文件夾,啟動(dòng)Django自帶的測(cè)試服務(wù)器。啟動(dòng)服務(wù)器命令:Python manage.py runserver或在PyCharm集成環(huán)境中加載并運(yùn)行manage.py文件:按下Ctrl+Alt+R,在彈出的消息框中輸入任務(wù)名稱:runserver回車。服務(wù)器啟動(dòng)成功后,如果要退出服務(wù),在上圖所示窗口中按Ctrl-Break鍵可退出服務(wù);
18、如果要查看服務(wù)器運(yùn)行情況,在瀏覽器中訪問::8000,如圖8-8所示。在瀏覽器中顯示It worked!時(shí),說明Django開發(fā)環(huán)境搭建成功了。圖8-8 訪問測(cè)試服務(wù)器(3) 安裝應(yīng)用:打開setting.py文件,將建立的應(yīng)用添加到INSTALLED_APPS變量中,代碼如下:INSTALLED_APPS = django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.static
19、files, mysiteapp #添加應(yīng)用 (4) 打開mysiteapp文件夾下的views.pyimport datetimeimport django.http.HttpResponsedef sayHello(request): s = 大家好!,歡迎使用Python current_time = datetime.datetime.now() html = %s %s % (s, current_time) return django.http.HttpResponse(html)(5) 修改項(xiàng)目文件夾里的urls.py文件,將url(rsayhello/$,sayhello),映
20、射添加到urlpatterns中from django.conf.urls import urlfrom django.contrib import adminfrom mysiteapp.views import sayHello #導(dǎo)入sayHello()函數(shù)urlpatterns = url(radmin/, admin.site.urls), url(rsayhello/$,sayHello), #加入映射 圖8-9 頁面運(yùn)行結(jié)果重新啟動(dòng)項(xiàng)目,在瀏覽器中輸入:8000/sayhello就會(huì)看到如圖8-9所示的結(jié)果。8.4Django框架的應(yīng)用8.4.1 數(shù)據(jù)庫的配置1. Django數(shù)
21、據(jù)庫配置基礎(chǔ)在創(chuàng)建了Django項(xiàng)目后,在項(xiàng)目的文件夾中有settings.py文件,該文件是一個(gè)有關(guān)Django項(xiàng)目配置的文件,包含了代表Django設(shè)置的模塊級(jí)變量。Django數(shù)據(jù)庫配置就是通過修改settings.py文件中DATABASES變量的設(shè)置實(shí)現(xiàn)的。根據(jù)Python版本的不同選擇不同的適配器。Settings.py文件中的DATABASES模塊級(jí)變量的設(shè)置,如下面代碼所示。DATABASES = default: ENGINE: django.db.backends.mysql, # 數(shù)據(jù)庫引擎 NAME: student, # 數(shù)據(jù)庫名稱. USER: root, # 數(shù)據(jù)
22、庫用戶名 PASSWORD: 123456, # 數(shù)據(jù)庫密碼 HOST: , # 數(shù)據(jù)庫主機(jī),留空默認(rèn)為localhost PORT: 3306, # 數(shù)據(jù)庫端口 說明:(1) ENGINE:數(shù)據(jù)庫引擎,即數(shù)據(jù)庫服務(wù)器,其設(shè)置的值可以是:django.db.backends.postgresql,對(duì)應(yīng)PostgreSQL數(shù)據(jù)庫。django.db.backends.postgresql_psycopg2,對(duì)應(yīng)PostgreSQL數(shù)據(jù)庫。django.db.backends.mysql,對(duì)應(yīng)MySQL數(shù)據(jù)庫。django.db.backends.sqlite3,對(duì)應(yīng)SQLite數(shù)據(jù)庫。djang
23、o.db.backends.oracle,對(duì)應(yīng)Oracle數(shù)據(jù)庫。(2) NAME:數(shù)據(jù)庫名稱。如果使用MySQL數(shù)據(jù)庫,則其值為數(shù)據(jù)庫的名字;如果使用SQLite,數(shù)據(jù)庫為計(jì)算機(jī)上的一個(gè)文件,NAME將是數(shù)據(jù)庫文件的完整的絕對(duì)路徑。如果該文件不存在,它會(huì)在第一次同步數(shù)據(jù)庫時(shí)自動(dòng)創(chuàng)建。當(dāng)指定路徑時(shí)使用正斜杠,例如:”C:/homes/user/mysite/sqlite3.db”(3) USER:數(shù)據(jù)庫用戶名,即告訴django用哪個(gè)用戶連接數(shù)據(jù)庫 ( SQLite下不需要該項(xiàng)設(shè)置) 。(4) PASSWORD :數(shù)據(jù)庫密碼,即告訴django連接用戶的密碼 ( SQLite下不需要該項(xiàng)設(shè)置)
24、 。(5) HOST :數(shù)據(jù)庫主機(jī)地址,即告訴django連接哪一臺(tái)主機(jī)的數(shù)據(jù)庫服務(wù)器。如果數(shù)據(jù)庫服務(wù)器是同一臺(tái)物理機(jī)器,此處為空(或?yàn)?) (SQLite下不需要該項(xiàng)設(shè)置) 。(6) PORT:數(shù)據(jù)庫服務(wù)器端口,即告訴django連接數(shù)據(jù)庫時(shí)使用哪個(gè)端口(SQLite下不需要該項(xiàng)設(shè)置)。2. Django中sqlite3數(shù)據(jù)庫的配置默認(rèn)使用sqlite3數(shù)據(jù)庫,其在settings.py文件中關(guān)于數(shù)據(jù)庫的初始配置如下面代碼所示。DATABASES = default: ENGINE: django.db.backends.sqlite3, NAME: os.path.join(BASE_DI
25、R, db.sqlite3), 3. Django使用Mysql數(shù)據(jù)庫(1) Python連接mysql數(shù)據(jù)庫的常用驅(qū)動(dòng)程序常用驅(qū)動(dòng)程序:MySQLdb(mysql-python):。特點(diǎn):只支持到python2對(duì)Python3支持不好。網(wǎng)址:/pypi/MySQL-python/1.2.5Mysqlclient:特點(diǎn):MySQLdb的一個(gè)分支,它支持Python3。網(wǎng)址:/pypi/mysqlclientPyMySQL:特點(diǎn):純python的mysql驅(qū)動(dòng)。網(wǎng)址:/pypi/PyMySQL。MySQL connector for python:特點(diǎn):純Python的mysql驅(qū)動(dòng)。網(wǎng)址:/d
26、ownloads/connector/python/。(2) 安裝驅(qū)動(dòng)選擇mysql作為數(shù)據(jù)庫服務(wù)器,必須安裝其對(duì)應(yīng)的mysql數(shù)據(jù)庫驅(qū)動(dòng)程序。因?yàn)镸ySQLdb不支持Python3.2以上的版本,所以需要安裝其它的適應(yīng)Python3.2以上版本的驅(qū)動(dòng)。可以選擇安裝pymysql驅(qū)動(dòng),作為django操作myslq的適配器。其安裝命令為:Pip install pymysql配置數(shù)據(jù)庫在django項(xiàng)目中的settings.py配置文件中修改 DATABASES的設(shè)置。見8.3.2。修改_init_.py文件在項(xiàng)目同名文件夾下的_init _.py中,加入如下代碼,才能應(yīng)用安裝的mysql驅(qū)動(dòng)
27、,否則會(huì)報(bào)錯(cuò)。在文件中加入的代碼如下:import pymysqlpymysql.install_as_MySQLdb()8.4.2 創(chuàng)建數(shù)據(jù)模型1. ORM(Object Relational Mapping)對(duì)象關(guān)系映射ORM是通過使用描述對(duì)象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫中。Django 的ORM位于框架的中心,介于數(shù)據(jù)模型(在django.db.models.Model 類之上構(gòu)建的 Python 類)和基礎(chǔ)關(guān)系數(shù)據(jù)庫對(duì)象之間。2. 常用的模型數(shù)據(jù)類型Django 常用的數(shù)據(jù)模型字段見表8-3。表8-3 Django常用的數(shù)據(jù)模型字段類型3. 創(chuàng)建數(shù)據(jù)模
28、型【例8-2】創(chuàng)建一個(gè)Django數(shù)據(jù)模型,并生成數(shù)據(jù)庫表。打開mysite文件夾中的models.py文件,在文件中創(chuàng)建如下代碼:From Django.db import models#創(chuàng)建模型class Users(models.Model): username = models.CharField(max_length=64) password = models.CharField(max_length=64) registTime = models.DateTimeField() tel=models.CharField(max_length=11)4. 加入到站點(diǎn)管理打開admin
29、.py文件,將模塊引入到站點(diǎn)管理中,語句如下from django.contrib import adminfrom . import modelsadmin.site.register(models. Users)5. 同步數(shù)據(jù)庫執(zhí)行語句:pythonmanage.pymakemigrationspythonmanage.pymigrate執(zhí)行完成后將在MySql數(shù)據(jù)庫中創(chuàng)建mysiteapp_users表(APP名_類名)。說明:(1) 由于版本不同,有的同步命令語句使用“python manage.py syncdb”語句。(2) Django為每張表自動(dòng)添加一個(gè)id主鍵。(3) Dja
30、ngo中通過“manage.py inspectdb”可以將已有的數(shù)據(jù)庫表生成數(shù)據(jù)模型。例如:python manage.py inspectdb models.py6. 數(shù)據(jù)訪問創(chuàng)建了模型以后,Django自動(dòng)為這些模型提供了高級(jí)的Python API,可以輕松訪問數(shù)據(jù)庫表?!纠?-3】 針對(duì)上面的數(shù)據(jù)模型,插入一條數(shù)據(jù),并查看。運(yùn)行結(jié)果如下:QuerySet 該運(yùn)行結(jié)果并未將記錄的詳細(xì)信息顯示出來,為了解決這個(gè)問題,需要為Users類添加一個(gè)方法_unicode_()。_unicode_()方法將告訴Python如何將對(duì)象以u(píng)nicode的方式顯示出來。代碼如下:def _unicode_
31、(self): return u%s %s %s % (self.username, self.password,self.tel)為以上模型添加_unicode_()方法后,重新運(yùn)行pythonmanage.pyshell,即可以看到所需的數(shù)據(jù)。8.4.3 創(chuàng)建視圖視圖功能簡(jiǎn)稱“view”,是一系列的Python函數(shù),它接受一個(gè)Web請(qǐng)求,并返回一個(gè)Web響應(yīng)。1. 視圖函數(shù)的編寫視圖要和url路由、models、模板文件一起才能把頁面顯示出來。視圖函數(shù)在視圖文件views.py中,建立視圖函數(shù)代碼如下:from django.shortcuts import render#創(chuàng)建視圖Def
32、index(request):Return render(request,index.html)視圖還可以接受的參數(shù)。from django.http import HttpResponse例如:def hello(request, number): text = welcome to my app number %s!% number return HttpResponse(text)2. request對(duì)象request是一個(gè)HttpRequest對(duì)象。每一個(gè)視圖總是以一個(gè)HttpRequest對(duì)象作為它的第一個(gè)參數(shù)。Request常用的屬性包括:Path:請(qǐng)求頁面的全路徑,不包括域名。M
33、ethod:請(qǐng)求中使用的HTTP方法的字符串表示,全大寫表示。GET:包含所有HTTP GET參數(shù)的類字典對(duì)象。POST:包含所有HTTP POST參數(shù)的類字典對(duì)象。3. response對(duì)象request和 response 對(duì)象起到了服務(wù)器與客戶機(jī)之間的信息傳遞作用。request 對(duì)象用于接收客戶端瀏覽器提交的數(shù)據(jù),而 response 對(duì)象的功能則是將服務(wù)器端的數(shù)據(jù)發(fā)送到客戶端瀏覽器。HttpRequest對(duì)象由django自動(dòng)創(chuàng)建,但是,HttpResponse對(duì)象就必須自己創(chuàng)建。每個(gè)view請(qǐng)求處理方法必須返回一個(gè)HttpResponse對(duì)象,HttpResponse類在djang
34、o.http模塊中。HttpResponse對(duì)象上擴(kuò)展的常用方法包括:Render(): 頁面渲染。Redirect(”路徑”): 登錄跳轉(zhuǎn)。Locals():可以直接將函數(shù)中所有的變量傳給模板。【例8-4】 在例8-3的基礎(chǔ)上創(chuàng)建視圖。8.4.4 模板系統(tǒng)Django模板是一個(gè)文本文件,主要用于分割文檔的表示(presentation)和數(shù)據(jù)。模板中定義了占位符(placeholders)和各種定義文檔應(yīng)該如何顯示的基本邏輯(即模板標(biāo)簽,template tag)。1. 模板目錄設(shè)置在配置文件settings.py中,通過TEMPLATES_DIRS屬性設(shè)置模板目錄。TEMPLATES_DI
35、RS=(./templates,) 2. Django模板語言Django模板引擎提供了一個(gè)小型的語言來定義應(yīng)用程序面向用戶的層。(1)顯示變量語法格式:variable表示給定變量的值插入到模板中。例如:username,模板由視圖在渲染(render)函數(shù)的第三個(gè)參數(shù)發(fā)送的變量來替換變量。(2) 過濾器語法格式:var|filters模板過濾器將變量在顯示前轉(zhuǎn)換它們的值的方式。例如:string|truncatewords:80過濾器將截?cái)嘧址?,只看到?0個(gè)字符。string|lower轉(zhuǎn)換字符為小寫。string|escape|linebreaks轉(zhuǎn)義字符串內(nèi)容,然后換行轉(zhuǎn)換為標(biāo)簽。
36、(3) 標(biāo)簽用% %包圍的是塊標(biāo)簽。標(biāo)簽可以執(zhí)行以下操作:if 條件,for循環(huán),模板繼承等。if標(biāo)簽表現(xiàn)為邏輯的if語句。就像在Python中,可以使用if,else和elif在模板中8.4.5 URL配置在Django框架中,urls.py的配置很關(guān)鍵,它就像是Django所支撐網(wǎng)站的目錄,本質(zhì)是URL模式以及要為該URL模式調(diào)用的視圖函數(shù)之間的映射表。通過該文件告訴Django,哪個(gè)URL調(diào)用哪段代碼URl格式為:urlpatterns = url(正則表達(dá)式, view函數(shù), 參數(shù), 別名, 前綴),例如上例中的url(rshowuser/$,showuser)語句。表示在地址欄中輸入
37、:http:/localhost:8000/showuser時(shí),就訪問mysiteapp目錄下的views.py文件中的showuser()函數(shù)。8.4.6 發(fā)布Django項(xiàng)目發(fā)布Django項(xiàng)目,就是把應(yīng)用放到apache等Web服務(wù)器上,供用戶瀏覽使用。Django框架包含了一個(gè)開發(fā)服務(wù)器,用它調(diào)試和測(cè)試Django應(yīng)用程序非常方便。但這個(gè)服務(wù)器只能在本地環(huán)境中運(yùn)行,不能用于網(wǎng)站的發(fā)布。因此,需要將Django應(yīng)用程序部署到常用的Web服務(wù)器上,比如Apache或lighttpd。項(xiàng)目的發(fā)布步驟如下:(1) 安裝apache2下載集成服務(wù)器軟件wamp2.5,按安裝向?qū)О惭b即可。安裝完成
38、后,設(shè)置mysql數(shù)據(jù)的登錄密碼。(2) 安裝mod_wsgiWSGI,全稱Web Server Gateway Interface,或者Python Web Server Gateway Interface,是Python專有的,定義了Python解釋器與Web服務(wù)器之間的一種簡(jiǎn)單而通用的接口。根據(jù)apache2.5服務(wù)器與python版本,下載符合兩者版本對(duì)應(yīng)關(guān)系的mod_wsgi模塊。將下載的.so文件重命名為mod_wsgi.so,并復(fù)制到apache的modules文件夾中,然后,在apache服務(wù)器的配置文件httpd.conf中加載mod_wsgi.so文件。打開apache的配
39、置文件httpd.conf,加入如下命令:#加載mod_wsgi.so模塊LoadModule wsgi_module modules/mod_wsgi.so重啟apache,模塊mod_wsgi.so被加載到服務(wù)器中。(3) 發(fā)布django創(chuàng)建的項(xiàng)目在c:wampwww目錄下,創(chuàng)建django目錄。復(fù)制項(xiàng)目文件夾(mysite)下的所有內(nèi)容到c:wampwwwdjango目錄下。配置apache服務(wù)器的httpd.conf文件。打開apache的配置文件httpd.conf,加入如下命令:#指定django項(xiàng)目的wsgi.py配置文件的路徑WSGIScriptAlias / c:/wamp
40、/www/django/mysite/wsgi.py #指定項(xiàng)目路徑WSGIPythonPath c:/wamp/www/django/ #絕對(duì)路徑為項(xiàng)目所在目錄Order deny,allowAllow from all(4) 修改settings.py文件Django項(xiàng)目創(chuàng)建時(shí),其狀態(tài)為調(diào)試模式,在發(fā)布該程序時(shí),應(yīng)該關(guān)閉調(diào)試模式。調(diào)試模式的設(shè)置在settings.py文件中,所以,修改該文件關(guān)閉調(diào)試模式。打開settings.py文件,找到debug與TemplateDebug設(shè)置,把兩項(xiàng)的值設(shè)置為False,即可。(5) 重啟apache服務(wù)器,在瀏覽器中輸入地址,如果成功顯示主頁,則表
41、示發(fā)布成功。8.5 Django框架的高級(jí)應(yīng)用8.5.1 管理界面1. Django admin管理工具Django提供了基于web的管理工具。Django自動(dòng)管理工具是django.contrib的一部分??梢酝ㄟ^項(xiàng)目的settings.py文件中的INSTALLED_APPS的屬性設(shè)置實(shí)現(xiàn)。settings.py文件代碼:INSTALLED_APPS=(django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,dja
42、ngo.contrib.staticfiles,)django.contrib是一套龐大的功能集,它是Django基本代碼的組成部分。2.激活管理工具通常在生成項(xiàng)目時(shí)會(huì)在urls.py中自動(dòng)設(shè)置好,只需去掉注釋即可激活管理工具。配置項(xiàng)如下所示:/HelloWorld/HelloWorld/urls.py文件代碼:# urls.pyfrom django.conf.urls import urlfrom django.contrib import adminurlpatterns = url(radmin/, admin.site.urls),圖8-11 Django后臺(tái)登錄界面當(dāng)這一切都配置好
43、后,Django管理工具就可以運(yùn)行了。3. 使用管理工具啟動(dòng)開發(fā)服務(wù)器,然后在瀏覽器中訪問 :8000/admin/,得到如圖8-11所示界面:圖8-12 Django后臺(tái)管理界面用戶名和密碼可以通過命令“python manage.py createsuperuser”來創(chuàng)建超級(jí)用戶。創(chuàng)建好后,可以在圖8-12所示頁面,輸入用戶名和密碼登錄,登錄后界面如圖8-12所示。為了讓admin界面管理某個(gè)數(shù)據(jù)模型,需要先注冊(cè)該數(shù)據(jù)模型到admin。比如,之前在mysiteapp中已經(jīng)創(chuàng)建了模型Users。修改admin.py文件如下:from django.contrib import adminf
44、rom mysiteapp.models import Users# Register your models here.admin.site.register(Users)刷新后即可看到 Users數(shù)據(jù)表。如圖8-13所示。圖8-13 Users數(shù)據(jù)表8.5.2 編輯數(shù)據(jù)庫登錄管理界面后,在管理界面中,每個(gè)數(shù)據(jù)模型之后都有兩個(gè)超鏈接,為add和change。這是兩種不同的操作,實(shí)現(xiàn)插入和修改數(shù)據(jù)庫中的數(shù)據(jù)。圖8-14 字段編輯界面1. 使用Django框架的管理界面向數(shù)據(jù)表中插入數(shù)據(jù)Django內(nèi)置的后臺(tái)管理界面可以實(shí)現(xiàn)向數(shù)據(jù)表插入數(shù)據(jù)。(1) 單擊Users域之后的“add”超鏈接,頁面跳
45、轉(zhuǎn)到增加用戶界面如圖8-14所示。圖8-15 修改記錄界面(2) 輸入相關(guān)信息后,單擊“save and addanother”按鈕。2. 使用Django框架的管理界面對(duì)數(shù)據(jù)表數(shù)據(jù)進(jìn)行修改(1) 單擊Users域之后的“change”超鏈接,頁面跳轉(zhuǎn)到如圖8-15所示。 (2) 修改相應(yīng)的信息后,單擊“save and addanother”按鈕,頁面跳轉(zhuǎn)到添加數(shù)據(jù)界面,并顯示前邊輸入的項(xiàng)目數(shù)據(jù)修改成功。也可以在此頁面中直接刪除數(shù)據(jù)。3. 使用Django框架提供的dbshell打開mysql,實(shí)現(xiàn)數(shù)據(jù)的顯示、添加與刪除(1) 打開命令提示符窗口,使用cd命令轉(zhuǎn)換到項(xiàng)目所在目錄,執(zhí)行命令:P
46、ython manage.py dbshell,打開mysql提示符界面,如圖8-16所示。圖8-16 dbshell運(yùn)行窗口(2) 在mysql提示符界面,使用SQL語句實(shí)現(xiàn)數(shù)據(jù)的顯示(select)、添加(insert)與刪除(delete)。SQL語句的使用可以參見第6章。4. 使用django提供的api實(shí)現(xiàn)數(shù)據(jù)操作Django框架提供了生成數(shù)據(jù)模型數(shù)據(jù)的API方法,就是直接調(diào)用數(shù)據(jù)模型的構(gòu)造函數(shù)生成對(duì)象,使用對(duì)象的save()方法將生成的對(duì)象保存到數(shù)據(jù)庫中,從而實(shí)現(xiàn)數(shù)據(jù)的添加操作;使用類的objects對(duì)象的all()方法可以獲得該數(shù)據(jù)模型的所有數(shù)據(jù)。修改數(shù)據(jù)后可以使用 save()
47、 或 update()修改數(shù)據(jù)庫中的數(shù)據(jù);使用對(duì)象的delete()方法可以刪除數(shù)據(jù)。# -*- coding: utf-8 -*- from django.http import HttpResponsefrom TestModel.models import test# 數(shù)據(jù)庫操作def testdb(request): # 刪除id=1的數(shù)據(jù) test1 = Test.objects.get(id=1) test1.delete()# 另外一種方式 test.objects.filter(id=1).delete() # 刪除所有數(shù)據(jù) test.objects.all().delete(
48、) return HttpResponse(刪除成功)8.5.3 Session功能Django中的Session是一個(gè)高級(jí)工具,它可以讓用戶存儲(chǔ)個(gè)人信息以便在下次訪問網(wǎng)站中使用這些信息。Django完全支持Session,它將數(shù)據(jù)保存在服務(wù)器端,并將發(fā)送和接收Cookie的操作包裝起來。在Cookie中包含的是Session ID,而不是數(shù)據(jù)本身。在Django框架中,Session將保存在request對(duì)象的session值中,此值是一個(gè)字典對(duì)象,可以通過字典的相關(guān)操作改變http的session值。Django中的Session有3種存儲(chǔ)方式:放在數(shù)據(jù)庫、緩存或者文件系統(tǒng)中,通過系統(tǒng)配置
49、文件setting.py來配置session的存儲(chǔ)。然后就可以通過數(shù)據(jù)庫,或者緩存,來操作session,比如設(shè)置、刪除、獲取session。1. 啟用Session在Django項(xiàng)目中啟動(dòng)Session功能,需要修改settings.py文件中的MIDDLEWARE_CLASSES元組類型的屬性值,在該元組中加入如下語句:django.contrib.sessions.middleware.SessionMiddleware,在配置文件settings.py中的INSTALLED_APPS元素類型的屬性值中加入如下語句:django.contrib.sessions,若此前沒有生成相關(guān)的數(shù)據(jù)
50、表,則需要調(diào)用manage.py makesmigrations和manage.py migrate來創(chuàng)建相應(yīng)的表,以便用于存儲(chǔ)Session數(shù)據(jù)。缺省情況下,Django將Session存儲(chǔ)在數(shù)據(jù)庫中(使用模型django.contrib.sessions.models.Session)。這些配置是默認(rèn)啟用的。每個(gè)配置都有默認(rèn)值,這些默認(rèn)值定義在djangoconfglobal_settings.py文件中。如果不需要這些配置,可以將其關(guān)掉,以節(jié)省服務(wù)器的開銷。如果需要自定義配置,可以在項(xiàng)目文件夾下的settings.py文件中進(jìn)行設(shè)置。2. 使用Session(1) 在視圖中把數(shù)據(jù)存放到s
51、ession中request.sessionkey=value(2)在視圖中從session中取出數(shù)據(jù)request.session.get(key,default=None)(3) 刪除sessiondel request.sessionkey(4) 在Django模板中使用session數(shù)據(jù)在模板中可以對(duì)session變量像訪問字典一樣訪問。需要查看所有session值的時(shí)候使用items方法。例如:% for key,value in request.session.items % ifequal role key % value.role_name % endifequal % end
52、for %8.5.4 國際化當(dāng)Web服務(wù)搭建好以后,開發(fā)人員需要調(diào)整軟件,使之能適用于不同的語言,即國際化和本地化。國際化-Internationalization,i和n之間有18個(gè)字母,簡(jiǎn)稱I18N。國際化的目標(biāo)是允許Web程序以多種語言提供內(nèi)容和功能。Django支持國際化,多語言,它提供了非常強(qiáng)大的翻譯機(jī)制,開發(fā)者一旦理解它的實(shí)現(xiàn),就能減少編碼量,提高開發(fā)效率。1. Django國際化簡(jiǎn)介Django框架支持國際化,可以在Django的安裝目錄sitepackages/django/conf/locale/文件夾下找到相關(guān)的語言文件。Django國際化的本質(zhì)就是開發(fā)者對(duì)需要翻譯的字符串
53、進(jìn)行標(biāo)記,并對(duì)字符串進(jìn)行相應(yīng)的翻譯。當(dāng)用戶訪問該Web時(shí),Django內(nèi)部框架根據(jù)用戶使用偏好進(jìn)行Web呈現(xiàn)。Django國際化使用的翻譯模塊是使用Python自帶的gettext標(biāo)準(zhǔn)模塊。Django國際化實(shí)際上是讓開發(fā)者和模板作者指定apps中要翻譯的字符串,即標(biāo)定這些字符串;Django根據(jù)特定訪問者的設(shè)置,對(duì)標(biāo)定的字符串進(jìn)行相應(yīng)的翻譯,翻譯為特定訪問者使用的語言和數(shù)據(jù)格式。開發(fā)人員和翻譯人員需要完成以下3個(gè)步驟:第一步:在Python代碼和模板中嵌入待翻譯的字符串。第二步:把那些字符串翻譯成需要支持的語言,并進(jìn)行相應(yīng)的編譯。第三步:在Django settings文件中激活本地中間件。
54、2. Django國際化的實(shí)現(xiàn)(1) 開啟國際化的支持,需要在settings.py文件中設(shè)置如下:MIDDLEWARE_CLASSES=(.django.middleware.locale.LocaleMiddleware,)LANGUAGE_CODE = enTIME_ZONE = UTCUSE_I18N = TrueUSE_L10N = TrueUSE_TZ = TrueLANGUAGES = (en, (English),(zh-hans, (中文簡(jiǎn)體),(zh-hant, (中文繁體),)#翻譯文件所在目錄,需要手工創(chuàng)建LOCALE_PATHS = (os.path.join(BAS
55、E_DIR,locale),)TEMPLATE_CONTEXT_PROCESSORS = (.django.core.context_processors.i18n,)(2) 指定翻譯字符串翻譯字符串指定了哪些文本應(yīng)該被翻譯,這些字符串通常在Python代碼和模板中出現(xiàn)。Python代碼國際化Django通常使用ugettext(),gettext_noop(),gettext_lazy()和ungettext()等函數(shù)實(shí)現(xiàn)翻譯字符串的標(biāo)定。Django應(yīng)用程序中,Python代碼主要集中在models.py和views.py中。例如:在views.py文件中的翻譯字符串的標(biāo)定From dja
56、ngo.utils.translation import ugettext as _ #標(biāo)定字符串的函數(shù)Weekdays=_(Monday),_(Tuesday),_(Wednesday) #標(biāo)定字符串Django模板國際化Django在模板文件中的國際化,需要使用以下標(biāo)簽:% load i18n %:用于加載已有的模板。i18n.py文件中定義了指定模板中翻譯字符串的模板標(biāo)簽。% trans str %:標(biāo)記翻譯一個(gè)常量字符串或可變內(nèi)容。在該標(biāo)簽中,不允許使用模板中的變量,只能使用單引號(hào)或雙引號(hào)中的字符串。如果翻譯時(shí)需要用到變量(占位符),可以使用% blocktrans %標(biāo)簽。注意:Templates文件夾要放在project文件夾下,否則國際化會(huì)失敗。(3) 創(chuàng)建語言文件在應(yīng)用程序目錄下,建立local目錄,然后運(yùn)行創(chuàng)建語言文件命令,從而產(chǎn)生語言文件django.po。Django 1.9及以上版本使用的創(chuàng)建語言文件的命令:Python manage.py makemessages l zh_hansPython manage.py makemessages l zh_hant(4) locale文件夾中的語言文件django.poDjango.po文件是一個(gè)純文本文件,包含用于翻譯的原始字符串和目標(biāo)語言字符串
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江省杭州市2024-2025學(xué)年七年級(jí)下學(xué)期第1次月考模擬測(cè)試卷(3月份)(原卷版+解析版)
- 14文言文二則《學(xué)弈》教學(xué)設(shè)計(jì)-2024-2025學(xué)年語文六年級(jí)下冊(cè)(統(tǒng)編版)
- 2024-2025學(xué)年新教材高中英語 Unit 6 Disaster and hope預(yù)習(xí) 新知早知道2教學(xué)實(shí)錄 外研版必修第三冊(cè)
- 2023一年級(jí)語文下冊(cè) 第二單元 2 我多想去看看配套教學(xué)實(shí)錄 新人教版
- 2024年四年級(jí)英語下冊(cè) Module 3 My colourful life Unit 8 Days of the week第1課時(shí)教學(xué)實(shí)錄 牛津滬教版(三起)
- 2024-2025學(xué)年高中政治 第1單元 生活智慧與時(shí)代精神 第2課 百舸爭(zhēng)流的思想 第1框 哲學(xué)的基本問題教學(xué)實(shí)錄 新人教版必修4
- 2024-2025學(xué)年高中歷史 第一單元 古代中國經(jīng)濟(jì)的基本結(jié)構(gòu)與特點(diǎn) 第2課 古代手工業(yè)的進(jìn)步(3)教學(xué)教學(xué)實(shí)錄 新人教版必修2
- 2024-2025學(xué)年高中化學(xué) 開學(xué)第一周 第一章 從實(shí)驗(yàn)學(xué)化學(xué) 第1節(jié) 化學(xué)實(shí)驗(yàn)基本方法教學(xué)實(shí)錄 新人教版必修1
- 17 盼 教學(xué)設(shè)計(jì)-2024-2025學(xué)年語文六年級(jí)上冊(cè)(統(tǒng)編版)
- 2024-2025學(xué)年高中歷史 第二單元 東西方的先哲 第3課 古希臘文化的集大成者亞里士多德(2)教學(xué)教學(xué)實(shí)錄 新人教版選修4
- 2024年黑龍江公務(wù)員《行政職業(yè)能力測(cè)驗(yàn)》試題真題及答案
- 2025年鄂爾多斯職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫必考題
- 項(xiàng)目立項(xiàng)申請(qǐng)書與立項(xiàng)調(diào)研報(bào)告
- 2025年企業(yè)與個(gè)體工商戶長(zhǎng)期供銷合同模板
- 2025年全民國家安全教育日主題教育課件
- 家政收納培訓(xùn)課件
- 北京市石景山區(qū)2024-2025學(xué)年高三上學(xué)期期末英語試題【含答案解析】
- 聲學(xué)基礎(chǔ)課后題答案
- 腫瘤專業(yè)十種常見疾病質(zhì)量控制指標(biāo)全年統(tǒng)計(jì)表
- 體育與健康-羽毛球運(yùn)動(dòng)
- 2025年南京信息職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
評(píng)論
0/150
提交評(píng)論