Django框架簡介,wsgiref 與 jinja2 模塊

框架簡介

  • Django是一個web開發框架,用來開發web應用,本質就是, web框架+socket服務端python

  • MVC框架和MTV框架
MVC,全名是Model View Controller,是軟件工程中的一種軟件架構模式,把軟件系統分爲三個基本部分:
模(Model)、視圖(View)和控制器(Controller),具備耦合性低、重用性高、生命週期成本低等優勢。

Django框架的設計模式借鑑了MVC框架的思想,也是分紅三部分,來下降各個部分之間的耦合性。
Django框架的不一樣之處在於它拆分的三部分爲:Model(模型)、Template(模板)和View(視圖),也就是MTV框架。
  • M:model模型 和數據庫打交道
  • V:view 視圖 HTML
  • C:controller 控制器 調度 傳遞指令
    mysql

  • Django的MTV模式
Model(模型):負責業務對象與數據庫的對象(ORM)

       Template(模版):負責如何把頁面展現給用戶

       View(視圖):負責業務邏輯,並在適當的時候調用Model和Template
        
此外,Django還有一個urls分發器,它的做用是將一個個URL的頁面請求分發給不一樣的view處理,
view再調用相應的Model和Template
  • M:model模型 OMR
  • T:tempalte 模板 HTML
  • V:view 視圖 函數 業務邏輯web

  • 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 (主要要用開發測試使用,效率較低)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()
  • 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框架django

  • web 框架實現的功能flask

# django框架,tornado(異步非阻塞的輕量級框架),flask框架

django框架實現的功能  上圖的 2,3 功能

tornado框架實現的功能 上圖的 1,2,3 功能

flask框架實現的功能   上圖的 2 功能
相關文章
相關標籤/搜索