1. 程式人生 > >Python之web框架淺談

Python之web框架淺談

"""

<axiner>宣告:
(錯了另刂扌丁我)
(如若有誤,請記得指出喲,謝謝了!!!)

"""

Web application frameworks(網路應用框架),簡稱:web框架,用於構建web應用。

 

以下是axiner自制的一張簡圖:

 

工作原理簡易說明:
1、web伺服器(中介軟體)收到來自客戶端(瀏覽器)的請求(request)
2、中介軟體對request做一些預處理或者直接response請求
3、再經路由系統查詢對應的檢視函式來處理請求
4、檢視函式根據`業務邏輯控制`的需求將`模板`與`資料`進行渲染耦合
5、檢視函式處理完返回響應給web伺服器
6、web伺服器將響應傳送給客戶端
大致就這樣子哈...

 

 

 

web框架本質>>>其實就是socket

 

 

 

 

下面來構造一個簡易的web框架
首先介紹總體結構>>>

 

MinWeb:
基於Python27-wsgiref自定義的簡易web框架,
以下是框架目錄,根據MVC模式構建...
=====================

MinWeb

│── controllers

│ └── __init__.py
│ └── index.py
│ └── ...

│── models
│ └── __init__.py
│ └── ...
│ └── ...

│── views
│ └── index.html
│ └── ...
│ └── ...

│── __init__.py

│── manage.py

│── urls.py

└ ─  README.md

 

只是簡易淺談
所以
示例中未使用資料庫,也沒有使用靜態檔案...

 

下面所有程式碼展示:

 

    # manage.py/  
    # -*- coding:utf-8 -*-  
    from wsgiref.simple_server import make_server  
    from urls import URLS  
      
    def Runserver(environ,start_response):  
        start_response('200 OK' ,[('Content-Type', 'text/html')])  
        # wsgiref將請求封裝到引數environ裡,start_response引數為響應  
        # 獲取使用者url  
        url = environ['PATH_INFO']  
        if url in URLS.keys():  
            func_name = URLS[url]  
            ret = func_name()  
        else:  
            ret = '<h1>404<h1>'  
        return ret  
      
      
    def run():  
        httpd = make_server('', 8000, Runserver)  
        httpd.serve_forever()  
      
    if __name__=='__main__':  
        run()  

# 對上程式碼簡易說明:此可以說是控制整個程式執行的檔案

 

 

 

    # urls.py/  
    from controllers import index  
      
    URLS ={  
        '/': index.index,  
        '/new': index.new,  
    }  

# 對上程式碼簡易說明:此是路由系統,也就是路由對映,處理url與檢視函式關係的

 

 

 

    # controllers/index.py/    
    # -*- coding:utf-8 -*-    
    import os    
    import datetime    
    from jinja2 import Template    
    import sys    
        
    reload(sys)    
    sys.setdefaultencoding('utf-8')    
        
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))    
    # print os.path.join(BASE_DIR, 'views', 'index.html')    
        
    def index():    
        # 無jinja2的渲染    
        # f = open(os.path.join(BASE_DIR, 'views', 'index.html'), 'r')    
        # data = f.read()    
        # f.close()    
        # now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S %p')    
        # new_data = data.replace('{{ time }}',str(now_time))    
        # return new_data    
        
        # 使用jinja2渲染    
        f = open(os.path.join(BASE_DIR, 'views', 'index.html'), 'r')    
        result = f.read()    
        template = Template(result)    
        now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S %p')    
        data = template.render(time=now_time)    
        return data.encode('utf-8')    
        
        
    def new():    
        new = 'hello new'    
        return new  

# 對上程式碼簡易說明:此便是重要的業務邏輯控制檔案,處理模板與資料之間的渲染耦合

 

 

 

<!--# views/index.html/-->  
<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>index</title>  
</head>  
<body>  
<div class="main" style="border: 1px dashed gray;width: 255px;height: auto">  
    <p>nowtime:</p>  
    <p>    {{ time }}</p>  
</div>  
  
<div>  
    <h1>hello web</h1>  
    <div>this is foo</div>  
</div>  
  
</body>  
</html> 

# 對上程式碼簡易說明:此是一個簡易的模板
 

 

Uh-oh,

完了...