本文面向:有Python基礎,剛接觸web架構的Django初學者。
環境:windows7 python3.5.1 pycharm Django 1.10版 pip3
一、Django簡介
百度百科:一個開放源代碼的Web架構,由Python語言編寫......
重點:一個大而全的架構,啥都替你考慮好了。
1. web架構介紹
具體介紹Django之前,必須先介紹WEB架構的概念。
web架構: 别人已經設定好的一個web網站模闆,你學習它的規則,然後“填空”或“修改”成你自己需要的樣子。
一般web架構的架構是這樣的:
其它基于Python的web架構,如tornado、flask、webpy都是在這個範圍内進行增删裁剪的。例如Tornado用的是自己的異步非阻塞“wsgi”,flask則隻提供了最精簡和基本的架構。Django直接使用WSGI,并實作了大部分Web應用相關的功能。
我在文末左側有為你準備Python flask的零基礎系統學習課程,點選:了解更多就可以看見了,希望大家多多支援!
2. MVC/MTV介紹
MVC百度百科:全名Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟體工程典範,用業務邏輯、資料、界面顯示分離的方法組織代碼,将業務邏輯聚集到一個部件裡面,在改進和個性化定制界面及使用者互動的同時,不需要重新編寫業務邏輯。
通俗解釋:一種代碼和檔案的組織和管理形式!不要被縮寫吓到了,這其實就是把不同類型的檔案放到不同的目錄下的一種方法,然後取了個高大上的名字。當然,它帶來的好處有很多,比如前後端分離,松耦合等等,在使用中你慢慢體會就會逐漸明白它,具體就不詳細說明了。
其中:
模型(model):定義資料庫相關的内容,一般放在models.py檔案中。
視圖(view):定義HTML等靜态網頁檔案相關,也就是那些HTML、css、js等前端的東西。
*控制器(controller):定義業務邏輯相關,就是你的主要代碼。
MTV: Django覺得MVC的字面意思很别扭,不太符合它的理念,就給它改了一下。view不再是HTML相關,而是主業務邏輯V了,相當于控制器。HTML被放在Templates中,稱作模闆T,于是MVC就變成了MTV。這其實就是一個文字遊戲,和MVC本質上是一樣的,換了個名字和叫法而已,換湯不換藥。
小編推薦一個學Python的學習q u n【 二二七 】【四三五 】【四五零 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙内有開發工具,很多幹貨和技術資料分享!希望新手少走彎路
3.Django的MTV模型組織
目錄分開,就必須有機制将他們在内裡進行耦合。在Django中,典型的業務流程如下圖所示:
二、Django項目執行個體
1. 程式安裝
python3.5、pip3及pycharm請自行安裝。
(1)安裝Django:
這裡隻介紹較為簡單的pip3指令安裝方式。
win+r,調出cmd,運作指令:pip3 install django,自動安裝Pypi提供的最新版本。
安裝完成後如下圖所示:
(2)配置系統環境 成功安裝Django後,在下圖中的路徑可找到django-admin.exe檔案,将它加入作業系統環境變量中。這樣在以後的調用會比較友善。
運作:django-admin help,能看到下面的内容表示安裝過程OK。
2. 建立django項目
在linux等指令行界面下,使用django提供的指令和vim也能進行項目開發。但是,這裡推薦使用pycharm這個目前最好的Python開發IDE,它功能強大,界面友好。(下面所有的操作都在pycharm中進行。)
點選:file-->new project,出現下面的對話框。
選擇Django欄目,輸入項目名稱,這裡采用國際慣例的mysite。選擇Python解釋器版本,點選create建立。
Django将自動生成下面的目錄結構:
與項目同名的目錄中是配置檔案,templates目錄是HTML檔案存放處,也就是MTV中的T。manage.py是django項目管理檔案。
3. 建立APP
在每個Django項目中可以包含多個APP,相當于一個大型項目中的分系統、子子產品、功能部件等等,互相之間比較獨立,但也可以有聯系。
所有的APP共享項目資源。
在pycharm下方的terminal終端中輸入指令:
python manage.py startapp cmdb
這樣就建立了一個叫做cmdb的APP,django自動生成“cmdb”檔案夾。
4. 編寫路由
路由都在urls檔案裡,它将浏覽器輸入的url映射到相應的業務處理邏輯。
簡單的urls編寫方法如下圖:
5. 編寫業務處理邏輯
業務處理邏輯都在views.py檔案裡。
通過上面兩個步驟,我們将index這個url指向了views裡的index()函數,它接收使用者請求,并傳回一個“hello world”字元串。
6. 運作web服務
現在我們已經可以将web服務運作起來了。
指令行的方式是:python manage.py runserver 127.0.0.1:8000
但在pycharm中,你可以這麼幹:
在上部工具欄中找到下面圖示的圖示。
點選下拉箭頭
點選edit configurations
在host中填入:127.0.0.1 port中填入:8000
OK确定之後,點選綠色的三角,web服務就運作起來了。
按圖所示,自動跳轉到浏覽器程式界面。顯示的卻是下圖的404頁面:
修改一下url,添加“/index”,就一切ok了!
至此,一個最簡單的django編寫的web服務就啟動成功了。
7. 傳回HTML檔案
上面我們傳回給使用者浏覽器的是什麼?一個字元串!實際上這肯定不行,通常我們都是将HTML檔案傳回給使用者。
下面,我們寫這麼一個index.html檔案:
再修改一下views檔案:
為了讓django知道我們的HTML檔案在哪裡,需要修改settings檔案的相應内容。但預設情況下,它正好适用,你無需修改。
接下來,我們可以重新啟動web服務。在浏覽器重新整理一下,你會看到帶有樣式的“hello world”。
注:這裡有個小技巧,在多次頻繁重新開機服務時,由于端口未釋放的原因,容易啟動不了服務,修改一下端口就OK了。
8. 使用靜态檔案
我們已經可以将HTML檔案返還給使用者了,但是還不夠,前端三大塊,HTML、CSS、js還有各種插件,它們齊全才是一個完整
的頁面。在django中,一般将靜态檔案放在static目錄中。接下來,在mysite中建立個static目錄。
你的CSS,JS和各種插件都可以放置在這個目錄裡。
為了讓django找到這個目錄,依然需要對settings進行配置:
同樣,在index.html檔案中,可以引入js檔案了:
重新啟動web服務,重新整理浏覽器,檢視結果。
9. 接收使用者發送的資料
上面,我們将一個要素齊全的HTML檔案返還給了使用者浏覽器。但這還不夠,因為web伺服器和使用者之間沒有動态互動。
下面我們設計一個表單,讓使用者輸入使用者名和密碼,送出給index這個url,伺服器将接收到這些資料。
先修改index.html檔案
="en">
="UTF-8">
首頁
使用者輸入:
="/index/" method="post">
="text" name="username" />
="password" name="password" />
="submit" value="送出" />
然後修改views.py檔案
此時 ,重新開機web服務時,會出錯,因為django有一個跨站請求保護機制,我們在index.html檔案中加入一行{% csrf_token %}。
{% csrf_token %}
再次進入浏覽器,重新整理頁面:
輸入點東西,然後我們在pycharm中可以看到相應的資料。
10. 傳回動态頁面
我們收到了使用者的資料,但傳回給使用者的依然是個靜态頁面,通常我們會根據使用者的資料,進行處理後在傳回給使用者。
這時候,django采用自己的模闆語言,類似jinja2,根據提供的資料,替換掉HTML中的相應部分,詳細文法入門後再深入學習。
先改造views.py檔案:
再改造index.HTML檔案:
使用者展示:
="1">
使用者名
密碼
{% for line in data %}
{{ line.user }}
{{ line.pwd }}
{% endfor %}
重新開機服務,重新整理浏覽器:
可以看到,我們獲得了使用者實時輸入的資料,并将它實時展示在了使用者頁面上,這是個不錯的互動過程。
11. 使用資料庫
流程走到這裡,django的MTV架構基本已經浮出水面了,隻剩下最後的資料庫部分了。
上面我們雖然和使用者互動得很好,但并沒有儲存任何資料,頁面一旦關閉,或伺服器重新開機,一切都将回到原始狀态。
使用資料庫是毫無疑問的,django通過自帶的ORM架構操作資料庫,并且自帶輕量級的sqlite3資料庫。下面我們來看一看:
首先是注冊app:
不注冊它,你的資料庫就不知道該給哪個app建立表。
然後我們在settings中,配置資料庫相關的參數,如果使用自帶的sqlite,不需要修改。
再編輯models.py檔案,也就是MTV中的M。
這裡我們建立了2個字段,分别儲存使用者的名字和密碼。
接下來要在pycharm的teminal中通過指令建立資料庫的表了。有2條指令,分别是:
Python manage.py makemigrations
再輸入指令:Python manage.py migrate
修改views.py中的業務邏輯
重新開機web服務後,重新整理浏覽器頁面,之後和使用者互動的資料都能儲存到資料庫中。任何時候都可以從資料庫中讀取資料,展示到頁面上。
至此,一個要素齊全,主體架構展示清晰的Django項目完成了,其實很簡單是不是?
三、 Django總結
作為Python必學web架構的Django,它的功能強大,内容全面,但同時也意味着限制頗多,靈活性低,可修改性差,這就是魚和熊掌不可兼得了。我們學習Django,其實就是學習一個軟體,要了解它的基本原理,把握它整體架構,牢記一些基本規則,剩下的就是不斷深入細節,然後熟能生巧、經驗多少的問題了,不存在多高深的不可掌握技術。
關于學習方法的建議:學習任何東西,不要直接紮入細節,應該先了解它的外圍知識,看看它的整體架構,再學習它的基本内容,然後才是深入學習,打磨技巧!
全文完,有不對之處懇請指正,覺得不錯,就點贊支援一下。
文末知識點摘要:Python入門後再看點什麼好?
不止一次在頭條、微信、知乎有讀者朋友跑過來問:看完了基礎書,甚至看兩遍了,但自己寫的時候還是沒思路,我該怎麼辦?
程式設計在我看來就是一門手藝活,絕不是簡單通過看書就能學會的,跟學遊泳、學車、學鋼琴一個道理,沒别的,掌握了最基本的理論之後就是幹,隻有通過大量的練習、實戰才能掌握程式設計這門技能,之後再回過來頭來繼續深入理論
這個問題在知識星球也同樣被問題,于是在那裡我們設了每日一題的專題,每周會出三道題給大家,做完之後要求送出到 GitHub,我會統一對代碼進行 review。這些題一般都是出自于一些真實應用場景,通過這種方式來提高程式設計水準。
下面這道題我們在星球中的第三題,在你往下翻之前,不妨梳理下你的程式設計思路。
題目:
統計一個檔案中每個單詞出現的次數,列出出現頻率最多的5個單詞。
前言:
這道題在實際應用場景中使用比較廣泛,記得哪裡看到說李笑來就利用他的程式設計技能出版過一本背單詞的暢銷書,統計曆年來四六級、托福考試中出現的高頻詞彙,學生根據詞頻來記單詞,這種方式深受大家喜歡。這就是一個把程式設計技能用來解決實際問題的典型場景。
是以,哪怕你不是程式員,如果能掌握程式設計技能的話,也能給你的工作帶來極大的便利。
另外,在做資料分析時,那些詞雲效果本質上都是基于詞頻統計來控制字型的大小,如果你能熟練運用Python中的知識來解決問題的話,那說明你真正入門Python了。
分析:
本題主要考察以下幾個方面的知識點:
1、如何正确讀寫檔案
在 Python 中讀寫檔案可以使用内置函數open(),而 open 函數在python2 和 python3 中有一定的差別,比如 Python 中可以指定讀寫檔案的編碼格式,而 Python 則不可以,為了同時相容2和3,我們通常會使用io子產品下面的 open 函數,大家可以查文檔搞清楚它們之間的差別,培養主動學習能力和查資料的習慣。
另外一點是讀寫檔案完成之後是需要關閉檔案描述符的,除了可以使用 try...except...finally的文法之後,我們還可以使用更優雅的 with … as 的文法來自動關閉檔案。
2、如何對資料進行排序
sorted函數是一個使用頻率很高的内置函數,它的用法也很強大,因為它可以通過指定參數 key 來進行自定義排序,也就意味着你不僅可以對數字排序、對字母排序、還可以對清單、字典、自定義的對象進行排序,你隻需要要告訴 sorted 函數的排序規則是什麼,比如一個people對象,我既可以根據年齡排序也可以根據身高體重來排序,是以這個函數時非常靈活的,另外,對于清單對象有自帶的 sort 方法,如果能區厘清楚 list.sort 與 sorted 之間差別那說明你已經能靈活運用了。
3、匿名函數的使用
剛說了sorted函數可以指定一個參數來控制排序的規則,這個參數可以是一個函數,這種場景往往匿名函數,就是我們常說的lambda函數顯得很應景。
4、字典類型的運用
做詞頻統計,用字典無疑是最合适的資料類型,單詞作為字典的key, 單詞出現的次數作為字典的 value,很友善地就記錄好了每個單詞的頻率,字典很像我們的電話本,每個名字關聯一個電話号碼。另外,字典最大的特點就是它的查詢速度會非常快。理想情況下時間複雜度為O(1),我是說理想情況。
5、正規表達式的運用
處理文本、字元串,正規表達式簡直是神器,無論是做資料爬蟲還是表單驗證使用非常廣泛,當然,正規表達式并不是 Python 特有的東西,所有程式設計語言都支援,我們除了學習正規表達式的基本規則之外就是Python中的re子產品提供的各種函數了,隻有熟悉了API 我們才能運用到實際場景中去。
以上5點,每個點都可以整理出一篇文章出來
實作:
分析完之後,我們實作起來其實是非常快的。是以我們在拿到一個需求的時候,首先肯定是把需求弄清楚,想想大概可以用哪些技術來實作,随後才是動手寫代碼,其實我們在工作上,真正寫代碼的時間還不到一半。
列印結果:
總結
當然,實作方法不是唯一的。比如Python子產品本身就提供了一個collections.Counter的類,它繼承自dict類,就是用于做統計的,細心的你可能發現了,我實作的這個Counter和collections下面那個Counter很像,其實這就是造輪子,造輪子可以鍛煉我們的程式設計思維,當然在工作上有現成的東西就沒必要自己造輪子了,除非你有信心做得更好。你也可以思考假如Python沒有提供Counter這個工具,你該怎麼做。
另外,該子產品還提供一個有序的字典對象 OrderedDict,使用它可以免去我們手動排序的操作。對于上面提及的知識點你是否都了然于心了,如果回答是的話,恭喜你,我想你應該掌握差不多了,進階吧,如果你還有很多不清楚的地方,那麼需要你更多的總結、練習。