一個簡單的Python MVC架構(4)

來源:互聯網
上載者:User

標籤:

前面都是準備,這裡是整個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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.