一个简单的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,不妥地方难免,还望赐教。大家也可以交流。

时间: 2024-10-17 04:48:49

一个简单的Python MVC框架(4)的相关文章

一个简单的python MVC框架(1)

因为买了本机器学习的书是python的,所以学习了一下python,就用python做了一个简单的web开发的mvc小框架.整个框架分为实体层,数据访问层,业务基类层,Web请求转发层,控制层和视图层.当然也包括一些辅助性工具类.下面一一介绍,希望对跟我一样初学python的有点帮助:1)实体层      由实体基类和用户实体类组成.实体类可以由数据库自动生成,提供了一个DbTools,可以自动生成规则的实体.下面是实体基类: import threading #用户错误类,用于抛出自定义的异常

一个简单的Python MVC框架(2)

2)数据库访问层数据访问层是与数据库进行交互的接口,这里我仅仅实现了mysql的访问接口.下面是代码: import pymysql import os #用于测试 class EmptyModel: def __init__(self,name=None): self.TableName=name #数据库帮助基类,相当于接口.其实对于python这种语言,这个类完全没必要存在. #不过对于多种数据库支持时,还是有点用. #注意:这里的参数是格式化到字符串,无法防止SQL注入.为了防止SQL注

一个简单额Python MVC框架(3)

MVC中的M已经介绍完了,C和V都是用户代码,先看几个工具类:A)全局变量类,用户定义全局变量和一个用于产生普通对象的类型: gl_A=1 gl_B='a' class Obj: def __init__(self): self.Obj=self 如果需要,大家可以定义自己的全局性变量.B)OsHelper.用于动态加载模块,获取类型 import imp import inspect import uuid #加载控制模块和类,读取文件,获取GUID class OsHelper: @stat

从零构建一个简单的 Python Web框架

为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何工作的很感兴趣,因为你想要成为一位更好的 web 开发者. 接下来的笔墨将着重于最后一点.这篇文章旨在通过对设计和实现过程一步一步的阐述告诉读者,我在完成一个小型的服务器和框架之后学到了什么.你可以在这个代码仓库中找到这个项目的完整代码. 我希望这篇文章可以鼓励更多的人来尝试,因为这确实很有趣.它让

一个简单的python线程池框架

初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = "pandaychen" 5 6 import Queue 7 import sys 8 import os 9 import threading 10 import time 11

如何设计一个易用的MVC框架

导言 把一件简单的事情做复杂很容易,把一件复杂的事情做简单却不易.在计算机的世界里, 冯.诺依曼把复杂的电脑简化为:存储器,控制器,运算器和I/O设备; 丹尼斯·里奇把晦涩的汇编语言简化为258页的<C程序设计语言>; 詹姆斯高斯林把繁琐的跨平台编码简化为256条字节码指令: 对我们大部分人而言,把简单的事情做简单就足够了. 关于框架 框架是对某一类共通业务的封装,框架设计应该遵循几个基本的原则:1 易用性 2 稳定性3 扩展性,框架从来都是给别人用 的,框架的学习成本与他的复杂度成正比,如果

Spring学习(二)——使用用Gradle构建一个简单的Spring MVC Web应用程序

1.新建一个Gradle工程(Project) 在新建工程窗口的左侧中选择 [Gradle],右侧保持默认选择,点击next,模块命名为VelocityDemo. 2.在该工程下新建一个 module,在弹出的窗口的左侧中选择 [Gradle],右侧勾选[Spring MVC],如下图所示: 并勾选[Application server],下方选择框中选择Tomcat7.0,如无该选项,则选中右边的 [ New... ] -- [ Tomcat Server ], 配置 Tomcat .配置好后

从零开始实现一个简易的Java MVC框架(三)--实现IOC

Spring中的IOC IoC全称是Inversion of Control,就是控制反转,他其实不是spring独有的特性或者说也不是java的特性,他是一种设计思想.而DI(Dependency Injection),即依赖注入就是Ioc的一种实现方式.关于Ioc和DI的具体定义和优缺点等大家可以自行查找资料了解一下,这里就不详细赘述,总之spring的IoC功能很大程度上便捷了我们的开发工作. 在实现我们的Ioc之前,我们先了解一下spring的依赖注入,在spring中依赖注入有三种方式

作业1开发一个简单的python计算器

开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致 hint: re.search(r'\([^()]+\)',s).group() '(-