從webpy入手理解Django
寫在前面的話:對於初次接觸web框架的程序員來說,理解Django可能是一個挑戰。雖然Django真的已經做的非常好,文檔結構清晰,教程一步步由淺入深,不過對於http協議,請求&響應,web伺服器運行機制不太清楚,甚至沒有接觸過任何web框架的程序員來說,在入門Django的時候會不知道為啥我要這樣寫?希望這篇文章能幫助你。
一:什麼是Django?
官方的定義:Django是一個高級Python Web框架,鼓勵快速開發和乾淨,實用的設計。由經驗豐富的開發人員構建,它可以解決Web開發的大部分麻煩,因此您可以專註於編寫應用程序而無需重新發明輪子。它是免費和開源的。
直白的說,Django就是已經做好了你想到的(或者你還沒想到)的事情,還差「業務代碼」需要你寫,其它的,交給它吧!
二:為什麼是Django
python的web框架其實有非常多,如果按照流行程度排名,Django和Flask(估計熟悉spring的java程序員會對它一見鍾情哦)肯定是數一數二的。可是它們兩者的設計理念則完全不同。Django對程序員說,你就用我一個就夠了,我提供了所有的組件(工具)!Flask對程序員說,你用我也可以,我只提供了核心的web服務功能,其它的需要自己集成哦,如果某個組件(工具)你不喜歡,你可以隨便替換。
Django因為提供了幾乎所有web開發的組件,對初次接觸框架的程序員友好,所以這裡我們選擇Django。
三:從webpy入手Django
如果你熟悉javaEE,回想當初在學習的時候,是不是從學習servlet / JSP / javaBean 這些組件入手的?不會直接就去學習spring吧。Django因為大而全,隱藏了web開發的大部分的細節,留給程序員做的是業務邏輯「填空題」,其實對於理解整個Django不是太深刻。所以我打算從簡單的webpy入手來理解Django。
webpy是一個更簡單直接的web應用開發框架,官網傳送門(http://webpy.org/)。直接上例子:
#!/usr/bin/python
# --coding:utf-8--
#導入webpy的包
import web
urls = (
#映射2個地址,一個是/映射到index類,另外一個是/test映射到test類
/, index, /test, test
)
#請求 http://127.0.0.1:8080/ 顯示 hello world
class index:
def GET(self):
return "Hello, world!"
class test:
#使用curl或者post man等工具發起post請求 http://127.0.0.1:8080/test 會顯示post的內容
#例如:curl http://127.0.0.1:8080/test -X POST -d "title=test&name=test2"
def POST(self):
input = web.data()
print(input)
#請求 http://127.0.0.1:8080/test 顯示 This is test get!
def GET(self):
return "This is test get!"
if __name__ == "__main__":
# 啟動web伺服器
app = web.application(urls, globals())
app.run()
注意這個例子需要在python3.5.6的環境下運行,在3.7的環境下會報錯。程序運行起來後,已經啟動了一個web伺服器。可以通過瀏覽器http://127.0.0.1:8080直接打開。
仔細分析一下例子,web伺服器是由webpy來啟動的,如果不指定埠,默認是8080,程序會打開並且監聽8080埠。在程序的最開始,定義了urls的一個tuple,這個是url和處理邏輯的映射。至於是採用GET/POST方法,就直接寫在定義的函數上(注意GET/POST必須大寫!)
可以看到,我們把url路由,業務邏輯處理(當前例子沒有資料庫信息處理,有的話也可以寫上),以及請求響應都寫在同一個python文件下了。而實際上一般會使用框架(如Django),使用MVT(Model / View / Template 其實和MVC模式一樣)模式來寫代碼。這樣的好處是「解耦「,提高程序的「可擴展性」和「可維護性」,如果你還不能理解,先記住吧,這是前人總結下來的「模式」,一般不會錯。
Django包含了幾個組件:路由Route,視圖View,模版Template,模型Model。如下圖: