1. 程式人生 > >一個簡單的Python MVC框架(4)

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

前面都是準備,這裡是整個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 environ
import cgi, cgitb
from OsHelper import OsHelper
import gl
from HtmlHelper import HtmlTools
theCGI = 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
    exit
if 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 gl
from OsHelper import OsHelper
from HtmlHelper import HtmlTools
class 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,不妥地方難免,還望賜教。大家也可以交流。