13.python中web框架概念的引入。
一、什麽是web框架?
框架,就是一個為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用框架可以幫你快速開發特定的系統,簡單地說,就是你用別人搭建好的舞臺來做表演。
對於所有的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。
最簡單的Web應用就是先把HTML用文件保存好,用一個現成的HTTP服務器軟件,接收用戶請求,從文件中讀取HTML,返回。
如果要動態生成HTML,就需要把上述步驟自己來實現。不過,接受HTTP請求、解析HTTP請求、發送HTTP響應都是苦力活,如果我們自己來寫這些底層代碼,還沒開始寫動態HTML呢,就得花個把月去讀HTTP規範。
正確的做法是底層代碼由專門的服務器軟件實現,我們用Python專註於生成HTML文檔。因為我們不希望接觸到TCP連接、HTTP原始請求和響應格式,所以,需要一個統一的接口,讓我們專心用Python編寫Web業務。
這個接口就是WSGI:Web Server Gateway Interface。
二、關於WSGI接口。
基本使用示範:
例1:
#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
import wsgiref.simple_server
def app(env,start_response):
print env #這個變量可以接收服務端和客戶端的一些相關信息。
print start_response
start_response(‘200 ok‘,[(‘Content-Type‘,‘text/html‘)]) #設置響應頭
return [‘<h1>hello!!</h1>‘]
httpd = wsgiref.simple_server.make_server(‘127.0.0.1‘,8888,app)
print "http port on 8888!!!"
httpd.serve_forever()
print environ[‘PATH_INFO‘] #獲取域名後的網站路徑信息。
path=environ[‘PATH_INFO‘]
start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
f1=open("index1.html","rb")
data1=f1.read()
f2=open("index2.html","rb")
data2=f2.read()
if path=="/yuan": #根據域名後面的路徑來判斷,返回哪些不同的頁面。
return [data1]
elif path=="/alex":
return [data2]
else:
return ["<h1>404</h1>".encode(‘utf8‘)]
前面我們定義的app函數並沒有任何可以解析http協議的部分,也就是說底層代碼不需要我們自己編寫,
我們只負責在更高層次上考慮如何響應請求就可以了。
我們自定義的app()函數必須由WSGI服務器來調用。有很多符合WSGI規範的服務器,我們可以挑選一個來用。
app()函數就是符合WSGI標準的一個HTTP處理函數,它接收兩個參數:
第一個參數為一個包含所有HTTP請求信息的dict對象。
另外一個參數接收的則是一個函數體,這個函數體用於發送響應頭。
在前面定義的app函數中調用start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
此時會發送一個http響應頭部,註意Header只能發送一次,也就是只能調用一次start_response()函數。
start_response()函數接收兩個參數,
一個是HTTP響應碼,一個是一組list表示的HTTP Header,每個Header用一個包含兩個str的tuple表示。
通常情況下,都應該把Content-Type頭發送給瀏覽器。其他很多常用的HTTP Header也應該發送。
然後,函數的返回值‘<h1>Hello, web!</h1>‘將作為HTTP響應的Body發送給瀏覽器。
有了WSGI,我們關心的就是如何從environ這個dict對象拿到HTTP請求信息,然後構造HTML,
通過start_response()發送Header,最後返回Body。
例2:
from wsgiref.simple_server import make_server
def f1():
f1=open("index1.html","rb")
data1=f1.read()
return [data1]
def f2():
f2=open("index2.html","rb")
data2=f2.read()
return [data2]
def app(environ, start_response):
print(environ[‘PATH_INFO‘])
path=environ[‘PATH_INFO‘]
start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
if path=="/p1":
return f1()
elif path=="/p2":
return f2()
else:
return ["<h1>404</h1>".encode("utf8")]
httpd = make_server(‘‘, 8502, application)
print ‘Serving HTTP on port 8084...‘
# 開始監聽HTTP請求:
httpd.serve_forever()
例3:
from wsgiref.simple_server import make_server
def f1(req):
print(req)
print(req["QUERY_STRING"])
f1=open("index1.html","rb")
data1=f1.read()
return [data1]
def f2(req):
f2=open("index2.html","rb")
data2=f2.read()
return [data2]
import time
def f3(req): #模版以及數據庫
f3=open("index3.html","rb")
data3=f3.read()
times=time.strftime("%Y-%m-%d %X", time.localtime())
data3=str(data3,"utf8").replace("!time!",str(times))
return [data3.encode("utf8")]
def routers():
urlpatterns = (
(‘/p1‘,f1),
(‘/p2‘,f2),
("/cur_time",f3)
)
return urlpatterns
def application(environ, start_response):
print(environ[‘PATH_INFO‘])
path=environ[‘PATH_INFO‘]
start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
urlpatterns = routers()
func = None
for item in urlpatterns:
if item[0] == path:
func = item[1]
break
if func:
return func(environ)
else:
return ["<h1>404</h1>".encode("utf8")]
httpd = make_server(‘‘, 8518, application)
print(‘Serving HTTP on port 8084...‘)
# 開始監聽HTTP請求:
httpd.serve_forever()
三、關於web框架的MVC與MTV模式。
MVC模式:
所謂MVC就是把web應用分為模型(M),控制器(C),視圖(V)三層;他們之間以一種插件似的,松耦合的方式連接在一起。
M則是“模型”,模型則是應用程序的核心(比如:數據庫中的表)
V代表“視圖”,這裏面所說的“視圖”,個人理解為業務邏輯,也可以理解為是應用程序中處理數據顯示的部分。(通常,“視圖”是根據“模型”中的數據創建出來的。)
視圖就是由HTML元素組成的界面,在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術已層出不窮,它們包括Adobe Flash和像XHTML,XML/XSL,WML等一些標識語言和Web services.
!!!註意!!MVC中的“視圖”和MTV中的“視圖”不是同一概念!!!MTV中的視圖指的是業務邏輯,負責業務邏輯,並在適當的時候調用Model和Template,MVC中的“視圖”則是指html文檔!!
C代表“控制器”,“控制器”用來處理和用戶的交互。(通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。)
模型表示企業數據和業務規則。在MVC的三個部件中,模型擁有最多的處理任務。例如它可能用像EJBs和ColdFusion Components這樣的構件對象來處理數據庫,被模型返回的數據是中立的,就是說模型與數據格式無關,這樣一個模型能為多個視圖提供數據,由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。
MTV模式:
django中所使用的是MTV模式。
MTV模式本質上與MVC模式沒有什麽差別,也是各組件之間為了保持松耦合關系,只是定義上有些許不同,Django的MTV分別代表。
M:Model(模型):負責業務對象與數據庫的對象(ORM)
T: Template(模版):負責如何把頁面展示給用戶。
V:View(視圖):負責業務邏輯,並在適當的時候調用Model和Template
此外,Django還有一個url分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template。
本文出自 “reBiRTH” 博客,請務必保留此出處http://suhaozhi.blog.51cto.com/7272298/1934697
13.python中web框架概念的引入。