Django是一個web開發框架,用來開發web應用,本質就是, web框架+socket服務端python
MVC,全名是Model View Controller,是軟件工程中的一種軟件架構模式,把軟件系統分爲三個基本部分: 模(Model)、視圖(View)和控制器(Controller),具備耦合性低、重用性高、生命週期成本低等優勢。 Django框架的設計模式借鑑了MVC框架的思想,也是分紅三部分,來下降各個部分之間的耦合性。 Django框架的不一樣之處在於它拆分的三部分爲:Model(模型)、Template(模板)和View(視圖),也就是MTV框架。
C:controller 控制器 調度 傳遞指令
mysql
Model(模型):負責業務對象與數據庫的對象(ORM) Template(模版):負責如何把頁面展現給用戶 View(視圖):負責業務邏輯,並在適當的時候調用Model和Template 此外,Django還有一個urls分發器,它的做用是將一個個URL的頁面請求分發給不一樣的view處理, view再調用相應的Model和Template
V:view 視圖 函數 業務邏輯web
服務器程序就須要爲不一樣的框架提供不一樣的支持。這樣混亂的局面不管對於服務器仍是框架,都是很差的。 對服務器來講,須要支持各類不一樣框架,對框架來講,只有支持它的服務器才能被開發出的應用使用。 這時候,標準化就變得尤其重要。咱們能夠設立一個標準,只要服務器程序支持這個標準,框架也支持這個標準, 那麼他們就能夠配合使用。一旦標準肯定,雙方各自實現。這樣,服務器能夠支持更多支持標準的框架, 框架也可使用更多支持標準的服務器。 WSGI(Web Server Gateway Interface)就是一種規範,它定義了使用Python編寫的web應用程序 與web服務器程序之間的接口格式,實現web應用程序與web服務器程序間的解耦。 經常使用的WSGI服務器有uWSGI、Gunicorn。而Python標準庫提供的獨立WSGI服務器叫wsgiref, Django開發環境用的就是這個模塊來作服務器
Python標準庫提供的獨立WSGI服務器叫wsgiref (主要要用開發測試使用,效率較低)sql
上線服務器通常使用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()
<!--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>
#上面的代碼實現了一個簡單的動態,我徹底能夠從數據庫中查詢數據,而後去替換我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框架django
web 框架實現的功能flask
# django框架,tornado(異步非阻塞的輕量級框架),flask框架 django框架實現的功能 上圖的 2,3 功能 tornado框架實現的功能 上圖的 1,2,3 功能 flask框架實現的功能 上圖的 2 功能