一:Web框架介紹
框架,即framework,特指為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用框架可以快速幫你開發特定的系統。
Web框架是別人已經設定好的一個web網站模板,你學習它的規則,然后“填空”或“修改”成你需要的樣子。簡單說,就是你用別人搭建好的舞台來表演。
一般Web框架的架構這樣的:
其他基於Python的Web框架,圖tornado,flask,webpy都是在這個范圍內進行增刪裁剪的。例如tornado用的是自己的異步非阻塞“wsgi”,flask則只提供了最精簡和基礎的框架。Django則是直接使用了WSGI,並實現了大部分功能。
Web開發是Python語言應用領域的重要部分,也是工作崗位比較多的領域。如果你對基於Python的Web開發有興趣,正打算開始學習使用Python做Web開發,或者已經是一個Web開發者有工作需要,要做Web服務,自動化運維,數據的圖形化展示等,那么學習一門基於Python的Web開發框架是必修課。
二:都有那些框架?
Python下有許多款不同的Web框架。在其二十多年的歷史中出現了數十種Web框架,比如Django,Tornado,Flask,Twisted,Bottle和Web.py等,他們歷史悠久,有的發展迅速,還有的已經停止維護了。Django是重量級選手中最有代表性的一位。許多成功的網站和APP都基於Django。
Django: Py Web應用開發框架 Diesel:基於Greenlet的事件I/O框架 Flask:一個用Py編寫的輕量級Web應用框架 Cubes:輕量級Py OLAP框架 Kartograph.py:創造矢量地圖的輕量級Py框架 Pulsar:Py的事件驅動並發框架 Web2py:全棧式Web框架 Falcon:構建雲API和網絡應用后端的高性能Py框架 Dpark:Py版的Spark Buildbot:基於Py的持續集成測試框架 Zerorpc:基於ZeroMQ的高性能分布式RPC框架 Bottle: 微型Py Web框架 Tornado:異步非阻塞IO的Py Web框架 webpy: 輕量級的Py Web框架 Scrapy:Py的爬蟲框架
三:為什么選擇Django?
首先介紹一下Django,Django具有以下特點:
- 功能完善,要素齊全:該有的,可以沒有的都有,自帶大量常用工具和框架,無須你自定義,組合,增刪及修改。
- 完善的文檔:經過十多年的發展和完善,Django有廣泛的實踐案例和完善的在線文檔,開發者遇到問題時可以搜索在線文檔尋找解決方案。
- 強大的數據庫訪問組件:Django的Model層自帶數據庫ORM組件,使得開發者無需學習其他數據庫訪問技術(SQL,pymysql,SQLALchemy等)
- 靈活的URL映射:Django使用正則表達式管理URL映射,靈活性高。新版的2.0,進一步提高了URL編寫的優雅型。
- 豐富的Template模板語言:類似jinjia模板語言,不但原生功能豐富,還可以自定義模板標簽,並且與其ORM的用法非常相似。
- 自帶后台管理系統admin:只需要通過簡單的幾行配置和代碼就可以實現一個完整的后台數據管理控制平台
- 完整的錯誤信息提示:在開發調試過程中如果出現運行錯誤或者異常,Django可以提供非常完整的錯誤信息幫助定位問題
四:基於Python進行Web開發的技術棧
要想熟練地使用Django進行Web開發,設計生產環境可用的,能夠應對一定規模訪問量的Web應用,開發者要學會的遠遠不止Django本身。Python基礎,環境搭建,前段語言,API設計,網站架構,系統管理,持續集成,服務化,數據處理,並發處理等等,都是相關的知識領域,包括但不限於以下的內容:
- 熟悉Python語言
- 對前端HTML\CSS\JavaScript比較熟悉
- 對網絡基礎,比如HTTP,TCP/IP等比較熟悉
- 熟悉數據庫,緩存,消息隊列等技術的使用場景和使用方法
- 日常能使用Linux或Mac系統工作(Windows屬於標配)
- 有性能優化經驗,能快速定位問題
除此之外,還要對業務有深刻理解,能夠寫出可維護性足夠高的代碼。當然,以上都是對經驗豐富的開發者而言,對於新手剛入門者,我們朝着這個目標努力學習就好。
下面是基於Python的Web開發技術棧:
五: MVC/MTV介紹
MVC百度百科:全名Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。
通俗解釋:一種文件的組織和管理形式!不要被縮寫嚇到了,這其實就是把不同類型的文件放到不同的目錄下的一種方法,然后取了一個高大上的名字。當然,它帶來的好處有很多,比如前后端分離,松耦合等,就不詳細說明了。
模型(model):定義數據庫相關的內容,一般放在Models.py文件中。
視圖(view):定義HTML等靜態網頁文件相關,也就是那些HTML,CSS,JS等前端的東西。
控制器(Controller):定義業務邏輯相關,就是我們的主要代碼。
MTV:有些WEB框架覺得MVC的字面意思很別扭,就給他改了一下,view不再是HTML相關,而是主業務邏輯了,相當於控制器。HTML被放在Templates中,被稱為模板,於是MVC就變成了MTV。這其實是一個文字游戲,和MVC本質上是一樣的,換了名字和叫法而已,換湯不換葯。
Django的MTV模型組織
目錄分開,就必須有機制將他們在內里進行耦合。在Django中urls,orm,static,settings等起着重要的作用。一個典型的業務流程是如下圖所示:
一般是用戶通過瀏覽器向我們的服務器發起一個請求(request),這個請求回去訪問視圖函數,(如果不涉及到數據調用,那么這個時候視圖函數返回一個模板也就是一個網頁給用戶),視圖函數調用模型,模型去數據庫查找數據,然后逐漸返回,視圖函數把返回的數據填充到模板中,最后返回網頁給用戶。
我們學習Django學習的是什么?
1,目錄結構規范
2,urls路由方式
3,settings配置
4,ORM操作
5,模板渲染
6,其他
Django是一個開放源代碼的Web應用框架,由Python寫成。
Django遵守BSD版權,初次發布於2015年7月,並於2008年9月發布第一個正式版本1.0.
Django采用了MVC的軟件設計模型,即模型M,視圖V和控制器C。
Django版本對應的Python版本:
准備知識:請求與相應的處理流程
首先看一個流程圖,這是我們訪問網站的流程圖:
用戶在瀏覽器里輸入網址(URL),回車之后就會向目標網址發送一個HTTP請求,服務器收到請求之后就會做出一個響應,把內容通過瀏覽器渲染出來,呈現給用戶看。
下圖,就是請求響應的過程:
1,創建Django項目
1.1 使用Pycharm圖形化界面創建
這里推薦使用Pycharm,它功能強大,界面友好。
1,點擊:file——》new project,出現下面的對話框。
選擇Django欄目,輸入項目名稱,這里采用國際慣例的mysite。選擇Python解釋器版本,點擊create創建。
2,Django將自動生成下面的目錄結構:
3,與項目同名的目錄中是配置文件,templates目錄是html文件存放也就是MTV中T。manage.py是Django項目管理文件。
1.2 使用terminal終端創建
進入指定的項目保存目錄,然后運行下面的命令:
django-admin startproject mysite
這樣就在目錄下面生成一個mysite目錄,也就是我們的Django項目的根目錄。它包含了一系列自動生成的目錄和文件,具備各自專有的用途。
注意:在給項目命名的時候必須避開Django和Python的保留關鍵字,比如“django”,“test”等,否則會引起沖突和莫名的錯誤。對於mysite的放置位置,不建議放在傳統的/var/wwww目錄下,它會具有一定的數據暴露危險,因此Django建議你將項目文件放在例如/home/mycode類似的位置。
一個新建的項目結果大概如下(上面已經給出了,在這里再次展示,主要解釋目錄意義)
mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py
各文件和目錄解釋:
- 外層的mysite目錄與Django無關,只是你項目的容器,可以任意命名。
- manage.py:一個命令行工具,用於與Django進行不同方式的交互腳本,非常重要,也是Django的管理主程序。
- 內層的mysite/ 目錄是真正的項目文件包裹目錄,他的名字是你引用內部文件的包明,例如:mysite.urls。
- mysite/__init__.py : 一個定義包的空文件。
- mysite/settings.py : 項目的主配置文件
- mysite/urls.py : 路由文件,所有的任務都是從這里開始分配,相當於Django驅動站點的內容表格。
- mysite.wsgi.py : 一個基於WSGI的web服務器進入點,提供底層的網絡通信功能(通常不用關心)
2,創建APP
在每個Django項目中可以包含多個APP,相當於一個大型項目中的分系統,子模塊,功能部件等等,相互之間比較獨立,但也有聯系。
APP應用和project項目的區別
- 一個APP實現某個功能,比如博客,公共檔案數據庫或者見到的投票系統
- 一個project是配置文件和多個APP的集合,這里APP組合成整個站點
- 一個project可以包含多個APP
- 一個APP可以屬於多個project
所有的APP共享項目資源。
APP的存放位置可以是任何地點,但是通常都將他們放在與manage.py腳本同級的目錄下,這樣方便導入文件。
在pycharm下面的terminal終端中輸入命令(pycharm中沒有可以創建APP的圖形化按鈕,需要在終端中輸入命令):
python manage.py startapp cmdb
這樣就創建了一個叫做cmdb的APP,Django自動生成“cmdb”文件夾。
3,編寫路由
路由都在urls文件里面,它將瀏覽器輸入的url映射到相應的業務處理邏輯。
簡單的urls編寫方法如下圖:
4,編寫業務處理邏輯
業務處理邏輯都在views.py文件里。
通過上面兩個步驟,我們將index這個url指向了views里的index()函數,它接受用戶請求,並返回一個“Hello world”字符串
5,運行web服務
現在我們已經可以將web服務運行起來了。
命令行的運行方式為:
python manage.py runserver 127.0.0.1:8000
命令行的展示如下:
但是在Pycharm中,我們可以這樣做:
1,在上步工具欄中找到下面圖示的圖標。
2,點擊下拉箭頭
3,點擊edit Configurations
4,在host中輸入:127.0.0.1 port中輸入:8000.
5,OK之后,點擊綠色的三角,web服務就運行起來了。
6,按圖所示,自動跳轉到瀏覽器程序頁面。顯示的卻是下圖中的404頁面:
,7,修改一下,添加“/index”,就一切OK了
至此,一個最簡單的Django編寫的web服務器就啟動成功了。
6,返回HTML文件
上面我們返回給用戶瀏覽器的是什么?一個字符串!實際上這肯定不行,通常我們都是將HTML文件返回給用戶。
1,下面我們寫這么一個index.html文件:
2,再修改一下views文件。
3,為了讓Django知道我們的HTML文件在哪里,需要修改settings文件的相應內容。但是默認情況下,它正好適用,你無需修改。
接下來,我們可以重新啟動web服務。在瀏覽器刷新一下,你會看到帶有樣式的“hello world”
注:這里有個小技巧,在多個頻繁重啟服務時,由於端口未釋放的原因,容易啟動不了服務,修改一下端口就OK了。
4,結果如下:
7,使用靜態文件
我們已經可以將HTML文件返回給用戶了,但是還不夠,前端三大塊,HTML,CSS,JS還有各種插件,他們齊全才是一個完整的頁面。在Django中,我們將這些文件統稱為“靜態文件”,因為這些文件的內容基本是固定不變的,不需要動態生成,一般將靜態文件放在static目錄中。
對於小項目,這些都不是問題,你可以將靜態文件放在任何你的web服務器能夠找到的地方。但是對於大型項目,尤其是那些包含多個APP在內的項目,處理那些由APP帶來的多套不同的靜態文件是個麻煩問題。當然了這也正是django.contrib,staticfiles的用途,它收集每個應用(和任何你指定的地方)的靜態文件到一個統一指定的地方,並且易於訪問。
7.1,在mysite中新建一個static目錄。
你的CSS,JS和各種插件都可以放置在這個目錄里。
7.2,為了讓Django找到這個目錄,依然需要對settings進行配置。
7.3,同樣在index.html文件中,可以引入js文件:
7.4,重新啟動web服務,刷新瀏覽器,查看結果。(因為導入js文件,並沒有渲染,所以頁面不變)
7.5 靜態文件的命名空間
與模板類似,我們可以將靜態文件直接放在polls/static(而不是創建另外一個polls子目錄),但這實際上是一個壞主意。Django將使用它所找到的第一個匹配的靜態文件,如果在你的不同應用中存在兩個同名的靜態文件,Django將無法區別他們。我們需要告訴Django該使用其中的哪一個,最簡單的方法就是為他們添加命名空間。也就是說,將這些靜態文件放在以他們所在應用的名字同名的另外一個子目錄下,也就是多建一層與應用同名的子目錄。
PS:良好的目錄結構是每個應用都應該創建自己的urls,views,models,templates和static,每個templates包含一個與應用同名的子目錄,每個static也包含一個與應用同名的子目錄。
7.6 直接訪問靜態文件
實際上不管是在Django開發服務器上,還是在nginx+uwsgi+django部署的服務器上,都可以通過url訪問靜態文件,不需要在Django中專門為每個靜態文件編寫url路由和視圖。
8,接受用戶發送的數據
上面,我們將一個要素齊全的HTML文件返還給了用戶瀏覽器。但這還不夠,因為web服務器和用戶之間沒有動態交互。
下面我們設計一個表單,讓用戶輸入用戶名和密碼,提交給index這個url,服務器將接收到這些數據。
1,先修改index.html文件
2,修改views.py文件
3,此時,重啟web服務時,會出錯,因為Django有一個csrf跨站請求保護機制,我們暫時在settings文件中將其關閉,或者在form表單里添加一個‘{% csrf_token %}' 標簽。這里為了演示方便,我們采用臨時關閉的方式。
報錯頁面結果如下:
命令行報錯結果如下:
在setting中將其注釋,如下:
再次進入瀏覽器,刷新頁面
輸入用戶名和密碼,我們可以在pycharm中看到相應的數據。
9,返回動態頁面
我們收到了用戶的數據,但返回給用戶的依然是個靜態頁面,通常我們會根據用戶的數據,進行處理后再返回給用戶。
這時候,Django采用自己的模板語言,類似jinja2,根據提供的數據,替換掉HTML中的相應部分,詳細語法以后再學習。
1,先改造views.py文件
2,再改造index.html文件:
3,重啟服務,刷新瀏覽器
可以看到,我們獲得了用戶實時輸入的數據,並將它實時的展示在了用戶頁面上,這是一個不錯的交互過程。
10,使用數據庫
流程走到這里,Django的MTV框架基本已經浮出水面了,只剩下最后的額數據庫部分了。
上面我們雖然和用戶交互的很好,但是沒有保留任何數據,頁面一旦關閉,或者服務器重啟,一切都將回到原點。
使用數據庫毫無疑問的,Django通過自帶的ORM框架操作數據庫,並且自帶輕量級的sqlite3數據庫,Django默認使用SQLite數據庫,因為Python源生支持SQLite數據庫,所以我們無需安裝任何程序,就可以直接使用,當然,如果我們創建一個實際的項目,可以使用類似PostgreSQL的數據庫,避免以后數據庫遷移的相關問題,下面我們先看一下。
1,首先是注冊app(打開mysite/settings.py配置文件,這是整個Django項目的設置中心):
不注冊它,你的數據庫就不知道該給哪個APP創建表。
默認情況,INSTALLED_APPS
中會自動包含下列條目,它們都是Django自動生成的:
- django.contrib.admin:admin管理后台站點
- django.contrib.auth:身份認證系統
- django.contrib.contenttypes:內容類型框架
- django.contrib.sessions:會話框架
- django.contrib.messages:消息框架
- django.contrib.staticfiles:靜態文件管理框架
2,在settings中,配置數據庫相關的參數,如果使用自帶的sqlite,不需要修改。
如果你想使用其他的數據庫,請先安裝相應的數據庫操作模塊,並將settings文件中DATABASES位置的'default'的鍵值進行相應的修改,用於連接數據庫。
- ENGINE(引擎):可以是django.db.backends.sqlite3,django.db.backends.postgresql,django.db.backends.mysql,django.db.backends.oracle,當然其他的也行。
- NAME(名稱):類似MySQL數據庫管理系統中用於保存項目內容的數據庫的名字。如果你使用的是默認的SQLite,那么數據庫將作為一個文件存在你的機器中,此時的NAME應該是這個文件的完整絕對路徑,默認值是 os.path.join(BASE_DIR, ’db.sqlite3’) ,將把該文件存儲在你的項目目錄下。
如果你不是使用默認的SQLite數據庫,那么一些諸如USER,PASSWORD和HOST的參數必須手動指定!下面給出一個基於pymysql操作Mysql數據庫的例子,更多細節參考此博文。
# mysite/settings.py # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases import pymysql # 一定要添加這兩行!通過pip install pymysql! pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'HOST': '192.168.1.1', 'USER': 'root', 'PASSWORD': 'pwd', 'PORT': '3306', } }
注意:
- 在使用非SQLite的數據庫時,請務必預先在數據庫管理系統的提示符交互模式下創建數據庫,你可以使用命令:“CREATE DATABASE database_name;”。Django不會自動幫你做這一步工作。
- 確保你在settings文件中提供的數據庫用戶具有創建數據庫表的權限,因為在接下來的教程中,我們需要自動創建一個test數據表。(在實際項目中也需要確認這一條要求。)
- 如果你使用的是SQLite,那么你無需做任何預先配置,直接使用就可以了。
在修改settings文件時,請順便將TIME_ZONE
設置為國內所在的時區Asia/Shanghai
。
同時,請注意settings文件中頂部的INSTALLED_APPS
設置項。它列出了所有的項目中被激活的Django應用(app)。你必須將你自定義的app注冊在這里。每個應用可以被多個項目使用,並且可以打包和分發給其他人在他們的項目中使用。
3,編輯models.py,也就是MTV中的M
模型本質上就是數據庫表的布局,再附加一些元數據。
Django通過自定義Python類的形式來定義具體的模型,每個模型的物理存在方式就是一個Python的類Class,每個模型代表數據庫中的一張表,每個類的實例代表數據表中的一行數據,類中的每個變量代表數據表中的一列字段。Django通過模型,將Python代碼和數據庫操作結合起來,實現對SQL查詢語言的封裝。也就是說,你可以不會管理數據庫,可以不會SQL語言,你同樣能通過Python的代碼進行數據庫的操作。Django通過ORM對數據庫進行操作,奉行代碼優先的理念,將Python程序員和數據庫管理員進行分工解耦。
這里我們創建了兩個字段,分別保存用戶的名稱和密碼
4,我們要在pycharm的teminal中通過命令創建數據庫的表,有兩條命令,分別是:
python manage.py makemigrations
通過運行makemigrations
命令,相當於告訴Django你對模型有改動,並且你想把這些改動保存為一個“遷移(migration)”。
migrations
是Django保存模型修改記錄的文件,這些文件保存在磁盤上。在例子中,它就是polls/migrations/0001_initial.py
,你可以打開它看看,里面保存的都是人類可讀並且可編輯的內容,方便你隨時手動修改。
接下來有一個叫做migrate
的命令將對數據庫執行真正的遷移動作。
再輸入命令:
Python manage.py migrate
migrate命令對所有還未實施的遷移記錄進行操作,本質上就是將你對模型的修改體現到數據庫中具體的表上面。Django通過一張叫做django_migrations的表,記錄並跟蹤已經實施的migrate動作,通過對比獲得哪些migrations尚未提交。
migrations的功能非常強大,允許你隨時修改你的模型,而不需要刪除或者新建你的數據庫或數據表,在不丟失數據的同時,實時動態更新數據庫。我們將在后面的章節對此進行深入的闡述,但是現在,只需要記住修改模型時的操作分三步:
- 在models.py中修改模型;
- 運行
python manage.py makemigrations
為改動創建遷移記錄; - 運行
python manage.py migrate
,將操作同步到數據庫。
之所以要將創建和實施遷移的動作分成兩個命令兩步走是因為你也許要通過版本控制系統(例如github,svn)提交你的項目代碼,如果沒有一個中間過程的保存文件(migrations),那么github如何知道以及記錄、同步、實施你所進行過的模型修改動作呢?畢竟,github不和數據庫直接打交道,也沒法和你本地的數據庫通信。但是分開之后,你只需要將你的migration文件(例如上面的0001)上傳到github,它就會知道一切。
命令行結果如下:
migrate命令將遍歷INSTALLED_APPS
設置中的所有項目,在數據庫中創建對應的表,並打印出每一條動作信息。如果你感興趣,可以在你的數據庫命令行下輸入:\dt
(PostgreSQL)、 SHOW TABLES;
(MySQL)或 .schema
(SQLite) 來列出 Django 所創建的表。
提示:對於極簡主義者,你完全可以在INSTALLED_APPS內注釋掉任何或者全部的Django提供的通用應用。這樣,migrate也不會再創建對應的數據表。
5,修改views.py中的業務邏輯
重啟Web服務后,刷新頁面,之后和用戶交互的數據都能保存到數據庫中,任何時候都可以從數據庫中讀取數據,展示到頁面上。
至此,一個要素齊全,主體框架展示清晰的Django項目完成了。
https://www.cnblogs.com/feixuelove1009/p/5823135.html