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,
完了...