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

2021-06-29 10:23:11 字數 3521 閱讀 9547

前面都是準備,這裡是整個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("控制名不存在

") thecando = false

exit

if theaction=='' or theaction==none:

print("動作不存在

") thecando = false

exit

#匯入控制類模組

themodule = oshelper.loadmodule(thecontrollername)

if themodule==none:

print("控制模組不存在

") thecando = false

exit

#匯入控制類型別

theclass = oshelper.loadclass(themodule,thecontrollername)

if theclass==none:

print("控制類不存在

") thecando = false

exit

#例項化控制類

theinst = theclass()

#匯入控制的action方法

themethod = oshelper.loadclass(theinst,theaction)

if themethod==none:

print("響應不存在

") 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('')

print('')

print('')

print('')

print("" % (viewbag.first_name, viewbag.last_name))

print('''''')

print("sessionid:"+viewbag.sessionid+"")

print('')

print('')

到這裡,mvc框架就算完成了,簡單吧,其實哪些鼎鼎大名的框架也基本是這種模式,只是細節處理方面要好很多。特別是路由的處置方面。但哪些只是技術細節,架構上,並無本質上的區別。我上面的框架如果把檢視和路由再處理一下,做一般的大小系統,足夠了。

因為初涉python,不妥地方難免,還望賜教。大家也可以交流。

乙個簡單的ExtJS搜尋建議框

封裝的是乙個ext4.2的元件,繼承並相容於ext的combobox.實現原理非常easy,在 combo 中監聽 keyup 事件就可以.搜尋建議的combo.基本上全然相容,使用方式與combo下拉框一樣.須要後台程式依據keyword進行搜尋建議.源 例如以下 搜尋建議框,使用時請適當改動包名...

製作乙個簡單的toast彈框

import toast from toast const obj install 是預設的方法。當外界在 use 這個元件的時候,就會呼叫本身的 install 方法 對外暴露乙個install方法即可 同時傳乙個 vue 這個類的引數。obj.install function vue expor...

乙個簡單的verlig程式 乙個簡單C程式的介紹

我們前面學了c語言的一些理論知識,今天通過乙個簡單的程式先來看一看c語言程式是什麼樣子。然後再對程式中的 進行介紹。這個語句的功能是進行有關的預處理操作。include稱為檔案包含命令,後面尖括號的內容稱為標頭檔案或首檔案。此處指包含stdio.h系統標頭檔案,在下面主函式中使用的printf 函式...