標籤:
前面都是準備,這裡是整個Web Mvc架構的核心地方,稍微多介紹一下。核心類是一個叫Dspth的模組。這裡我沒有處理路由,一個是不太熟,另外一個是主要是體會架構。我用的路由規則如下:
1)用URL的地址參數進行路由,有兩個參數,一個是ctr,表示控制類,一個是act表示執行的方法
2)所有執行方法都約定參數格式如下
self,Environ,CGI,CGITB,Form,Cookies,SessionId,*Args
當然,真正做架構的時候,可以把Environ,CGI,CGITB,Form,Cookies,SessionId這些參數用一個對象包含,通過全域性變數傳遞給控制類。或者放在控制類的基類中,也可以直接賦給控制對象(指令碼語言這樣處理非常方便)
下面是路由模組:
from os import environimport cgi, cgitbfrom OsHelper import OsHelperimport glfrom HtmlHelper import HtmlToolstheCGI = cgi;theCgitb = cgitb;theForm = cgi.FieldStorage()theEnviron = environ;theControllerName = theForm.getvalue(‘ctr‘)theAction = theForm.getvalue(‘act‘)theCookies=HtmlTools.GetCookies(theEnviron)theSessionId = theCookies.get(‘SESSIONID‘)theCanDo=True#寫入回應標頭資訊.if theSessionId==None: theSessionId = OsHelper.GetGuid()print(‘Content-type:text/html;‘)print("Set-Cookie:SESSIONID=%s;" % theSessionId)print("Set-Cookie:UserID=XYZ;")print("Set-Cookie:Password=XYZ123;")print("Set-Cookie:Expires=Tuesday, 31-Dec-2007 23:12:40 GMT\";")print("Set-Cookie:Domain=www.w3cschool.cc;")print("Set-Cookie:Path=/perl;")print("\r\n\r\n")if theControllerName==‘‘ or theControllerName==None: print("<html><head></head><body>控制名不存在</body></html>") theCanDo = False exitif theAction==‘‘ or theAction==None: print("<html><head></head><body>動作不存在</body></html>") theCanDo = False exit#匯入控制類別模組theModule = OsHelper.LoadModule(theControllerName)if theModule==None: print("<html><head></head><body>控制模組不存在</body></html>") theCanDo = False exit#匯入控制類類型theClass = OsHelper.LoadClass(theModule,theControllerName)if theClass==None: print("<html><head></head><body>控制類不存在</body></html>") theCanDo = False exit#執行個體化控制類theInst = theClass()
#匯入控制的Action方法theMethod = OsHelper.LoadClass(theInst,theAction)if theMethod==None: print("<html><head></head><body>響應不存在</body></html>") theCanDo = False exit#執行控制類的目標方法if theCanDo: theMethod(theEnviron,theCGI,theCgitb,theForm,theCookies,theSessionId)
下面是一個簡單的控制類:
import glfrom OsHelper import OsHelperfrom HtmlHelper import HtmlToolsclass Person: def __init__(self): self.first_name=‘‘ self.last_name=‘‘class Test: Count=1 def __init__(self): self.aaa=‘a‘ def Execute(self,Environ,CGI,CGITB,Form,Cookies,SessionId,*Args): ViewBag=gl.Obj() Test.Count+=1 theM = Person() HtmlTools.TryUpdate(theM,Form) ViewBag.first_name=theM.first_name ViewBag.last_name=theM.last_name ViewBag.SessionId=SessionId theViewText = OsHelper.ReadFile(‘testview.py‘) exec(theViewText)
大家注意,View視圖,我這裡並沒有進行特殊處理,僅僅是直接執行裡面的代碼,實際上可以很容易的實作類別似Asp的那種標記性視圖。要注意的,ViewBag這個對象是傳遞給視圖層的模型資料。因為採用的是直接執行視圖代碼的方法,整個視圖執行的變數範圍都在Execute方法裡,ViewBag是可以直接存取的。下面是視圖類:
print(‘<html>‘)print(‘<head>‘)print(‘<title>Hello Word - First CGI Program</title>‘)print(‘</head>‘)print(‘<body>‘)print(‘<h2>Hello Word! This is my first CGI program</h2>‘)print("<h2>HelloX %s %s</h2>" % (ViewBag.first_name, ViewBag.last_name))print(‘‘‘<form method="post" action="Dspth.py?ctr=test&act=execute" > <a>姓</a><input type="text" name="first_name" value="" /><br /> <a>名</a><input type="text" name="last_name" value="" /> <input type="submit" value="提交X"/> </form> ‘‘‘)print("<b>SessionId:"+ViewBag.SessionId+"</b>")print(‘</body>‘)print(‘</html>‘)
到這裡,MVC架構就算完成了,簡單吧,其實哪些鼎鼎大名的架構也基本是這種模式,只是細節處理方面要好很多。特別是路由的處置方面。但哪些只是技術細節,架構上,並無本質上的區別。我上面的架構如果把視圖和路由再處理一下,做一般的大小系統,足夠了。
因為初涉python,不妥地方難免,還望賜教。大家也可以交流。
一個簡單的Python MVC架構(4)