Django框架簡介,wsgiref 與 jinja2 模塊
- 2019 年 10 月 8 日
- 筆記
目錄
框架簡介
- Django是一個web開發框架,用來開發web應用,本質就是, web框架+socket服務端
- MVC框架和MTV框架
MVC,全名是Model View Controller,是軟件工程中的一種軟件架構模式,把軟件系統分為三個基本部分: 模(Model)、視圖(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等優點。 Django框架的設計模式借鑒了MVC框架的思想,也是分成三部分,來降低各個部分之間的耦合性。 Django框架的不同之處在於它拆分的三部分為:Model(模型)、Template(模板)和View(視圖),也就是MTV框架。
- M:model模型 和數據庫打交道
- V:view 視圖 HTML
- C:controller 控制器 調度 傳遞指令

- Django的MTV模式
Model(模型):負責業務對象與數據庫的對象(ORM) Template(模版):負責如何把頁面展示給用戶 View(視圖):負責業務邏輯,並在適當的時候調用Model和Template 此外,Django還有一個urls分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理, view再調用相應的Model和Template
- M:model模型 OMR
- T:tempalte 模板 HTML
- V:view 視圖 函數 業務邏輯
- WSGI(Web Server Gateway Interface 規範)
服務器程序就需要為不同的框架提供不同的支持。這樣混亂的局面無論對於服務器還是框架,都是不好的。 對服務器來說,需要支持各種不同框架,對框架來說,只有支持它的服務器才能被開發出的應用使用。 這時候,標準化就變得尤為重要。我們可以設立一個標準,只要服務器程序支持這個標準,框架也支持這個標準, 那麼他們就可以配合使用。一旦標準確定,雙方各自實現。這樣,服務器可以支持更多支持標準的框架, 框架也可以使用更多支持標準的服務器。 WSGI(Web Server Gateway Interface)就是一種規範,它定義了使用Python編寫的web應用程序 與web服務器程序之間的接口格式,實現web應用程序與web服務器程序間的解耦。 常用的WSGI服務器有uWSGI、Gunicorn。而Python標準庫提供的獨立WSGI服務器叫wsgiref, Django開發環境用的就是這個模塊來做服務器
wsgiref模塊
- Python標準庫提供的獨立WSGI服務器叫wsgiref (主要要用開發測試使用,效率較低)
- 上線服務器一般使用uWSGI
#wsgiref模塊來替換我們自己寫的web框架的socket server部分: """ 根據URL中不同的路徑返回不同的內容--函數進階版 返回HTML頁面 讓網頁動態起來 wsgiref模塊版 """ from wsgiref.simple_server import make_server # 將返回不同的內容部分封裝成函數 def index(url): # 讀取index.html頁面的內容 with open("index.html", "r", encoding="utf8") as f: s = f.read() # 返回位元組數據 return bytes(s, encoding="utf8") def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8") def timer(url): import time with open("time.html", "r", encoding="utf8") as f: s = f.read() s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S")) return bytes(s, encoding="utf8") # 定義一個url和實際要執行的函數的對應關係 list1 = [ ("/index/", index), ("/home/", home), ("/time/", timer), ] def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 設置HTTP響應的狀態碼和頭信息 url = environ['PATH_INFO'] # 取到用戶輸入的url func = None for i in list1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" return [response, ] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8090, run_server) httpd.serve_forever()
- html代碼
<!--index頁面 一個文件放一段代碼,我這裡寫在一起了--> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>index</title> </head> <body> <div>這是index頁面</div> </body> </html> <!--home頁面 一個文件放一段代碼,我這裡寫在一起了--> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>home</title> </head> <body> <div>這是home頁面</div> </body> </html> <!--time頁面 一個文件放一段代碼,我這裡寫在一起了--> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>time</title> </head> <body> <div>@@time@@</div> </body> </html>
- 執行結果



jinja2 模塊
#上面的代碼實現了一個簡單的動態,我完全可以從數據庫中查詢數據,然後去替換我html中的對應內容, 然後再發送給瀏覽器完成渲染。 這個過程就相當於HTML模板渲染數據。 本質上就是HTML內容中利用 一些特殊的符號來替換要展示的數據。 我這裡用的特殊符號是我定義的,其實模板渲染有個現成的工具: jinja2 #命令行安裝jinja2模塊 pip install jinja2 # 使用jinja2渲染index2.html文件: 代碼 from wsgiref.simple_server import make_server from jinja2 import Template def index(url): # 讀取HTML文件內容 with open("index2.html", "r", encoding="utf8") as f: data = f.read() template = Template(data) # 生成模板文件 ret = template.render({'name': '鋼蛋', 'hobby_list': ['抽煙', '喝酒', '上網']}) # 把數據填充到模板中 return bytes(ret, encoding="utf8") def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8") # 定義一個url和實際要執行的函數的對應關係 list1 = [ ("/index/", index), ("/home/", home), ] def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 設置HTTP響應的狀態碼和頭信息 url = environ['PATH_INFO'] # 取到用戶輸入的url func = None for i in list1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" return [response, ] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8090, run_server) httpd.serve_forever()
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <h1>姓名:{{name}}</h1> <!--規定寫法{{}}--> <h1>愛好:</h1> <ul> {% for hobby in hobby_list %} <!--規定寫法{% %}交給python識別--> <li>{{hobby}}</li> {% endfor %} <!--規定寫法{% endfor %}交給python識別 結束循環--> </ul> </body> </html>
- 執行結果



- 使用數據庫中查詢數據,來填充頁面
#使用pymysql連接數據庫: conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="xxx", db="xxx", charset="utf8") cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("select name, age, department_id from userinfo") user_list = cursor.fetchall() cursor.close() conn.close() #創建一個測試的user表: CREATE TABLE user( id int auto_increment PRIMARY KEY, name CHAR(10) NOT NULL, hobby CHAR(20) NOT NULL )engine=innodb DEFAULT charset=UTF8; #模板的原理就是字符串替換,我們只要在HTML頁面中遵循jinja2的語法規則寫上, 其內部就會按照指定的語法進行相應的替換,從而達到動態的返回內容。
- 簡單了解一下python web框架
- web 框架實現的功能

# django框架,tornado(異步非阻塞的輕量級框架),flask框架 django框架實現的功能 上圖的 2,3 功能 tornado框架實現的功能 上圖的 1,2,3 功能 flask框架實現的功能 上圖的 2 功能
作 者:郭楷豐