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 功能

作 者:郭楷豐