Django學習筆記(1)——初識Django

一:Web框架介紹

  框架,即framework,特指爲解決一個開放性問題而設計的具備必定約束性的支撐結構,使用框架能夠快速幫你開發特定的系統。html

  Web框架是別人已經設定好的一個web網站模板,你學習它的規則,而後「填空」或「修改」成你須要的樣子。簡單說,就是你用別人搭建好的舞臺來表演。前端

  通常Web框架的架構這樣的:python

  其餘基於Python的Web框架,圖tornado,flask,webpy都是在這個範圍內進行增刪裁剪的。例如tornado用的是本身的異步非阻塞「wsgi」,flask則只提供了最精簡和基礎的框架。Django則是直接使用了WSGI,並實現了大部分功能。mysql

  Web開發是Python語言應用領域的重要部分,也是工做崗位比較多的領域。若是你對基於Python的Web開發有興趣,正打算開始學習使用Python作Web開發,或者已是一個Web開發者有工做須要,要作Web服務,自動化運維,數據的圖形化展現等,那麼學習一門基於Python的Web開發框架是必修課。nginx

二:都有那些框架?

  Python下有許多款不一樣的Web框架。在其二十多年的歷史中出現了數十種Web框架,好比Django,Tornado,Flask,Twisted,Bottle和Web.py等,他們歷史悠久,有的發展迅速,還有的已經中止維護了。Django是重量級選手中最有表明性的一位。許多成功的網站和APP都基於Django。git

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設計,網站架構,系統管理,持續集成,服務化,數據處理,併發處理等等,都是相關的知識領域,包括但不限於如下的內容:github

  • 熟悉Python語言
  • 對前端HTML\CSS\JavaScript比較熟悉
  • 對網絡基礎,好比HTTP,TCP/IP等比較熟悉
  • 熟悉數據庫,緩存,消息隊列等技術的使用場景和使用方法
  • 平常能使用Linux或Mac系統工做(Windows屬於標配)
  • 有性能優化經驗,能快速定位問題

  除此以外,還要對業務有深入理解,可以寫出可維護性足夠高的代碼。固然,以上都是對經驗豐富的開發者而言,對於新手剛入門者,咱們朝着這個目標努力學習就好。web

下面是基於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

相關文章
相關標籤/搜索