加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 资讯 > 正文

宅男程序员给老婆的计算机教育之8 控制器

发布时间:2021-11-05 13:18:10 所属栏目:资讯 来源:互联网
导读:设计模式再高级一点,便是所谓的框架了。 从事Web开发,一般都会接触到MVC框架这个概念。 M:也就是Model,直接跟网站数据库相关。 V:也就是View,是网页的模版,跟显示数据相关。 C:则是Controller,相当于网站的业务逻辑。 MVC也不仅仅是应用于网站开发
设计模式再“高级”一点,便是所谓的“框架”了。
 
从事Web开发,一般都会接触到MVC框架这个概念。
 
M:也就是Model,直接跟网站数据库相关。
 
V:也就是View,是网页的模版,跟显示数据相关。
 
C:则是Controller,相当于网站的业务逻辑。
 
MVC也不仅仅是应用于网站开发,它的概念实际上植根于桌面软件,并且在手机软件开发上也有应用。
 
MVC本身是一个设计模式,是一个被验证过的,可以用来很好归纳、管理代码的软件开发方式。
 
基于这样的设计模式,提供了很多相关的类库实现,则“设计模式”升级为“框架”。
 
MVC的任何一个方面,扩展出去讲,都可以讲上几天几夜。
 
今天只讲C。
 
传统上,php / asp / asp.net web form等,使用的是所谓的 Page Controller Patterns:http://martinfowler.com/eaaCatalog/pageController.html
 
Page Controller简单的说,便是一个网址对应一个程序文件。
 
所以,我们会看到大量类似: show.php / show.asp / show.aspx 的网址存在,这样的网址,背后都有相应同名的文件。
 
这样的模式,是网站从静态转向动态是最自然的改变方便,也最为容易让初学者接受。
 
但随着网站的复杂化,这样的模式会慢慢显得不够方便;比方说,多个不同的网址,映射到相同的处理;比方说,处理的时候,复用共同的资源。
 
页面内容的动态化,同一个程序文件,显示的内容是动态生成的 - 根据不同的query string,生成不同的内容,如:show.php?id=1234
 
网页程序内部,实际上是需要解析网址中的query string,并做不同的操作。
 
这实际上是一个映射的过程,将网址映射到相应的处理。
 
为了方便做这样的映射,慢慢的出现了所谓的 Front Controller Patterns:
  http://martinfowler.com/eaaCatalog/frontController.html
 
这是通过某种机制,将符合各种规则的网址请求映射到程序中的一个类,或者是一个函数处理。
 
一般上,是使用正则表达式解析网址,并映射。
 
将网址映射到一个类;
 
urls = ("/home", "hello")  
app = web.application(urls, globals())  
 
class hello:  
  def GET(self):  
    return 'Hello, world!'
将网址请求映射到类,是相对较“重”的处理方式,比方说,需要处理类的初始化等等。
 
有的框架,也可以是一个函数,则相对“轻量”一些:
 
(r'^$', 'home'),  
 
def home(request):  
  return HttpResponse("Hello, world.")
类、函数,均各有优劣,但实际差异很小:
 
映射到类的方式,往往还会根据不同的HTTP header映射到类里面中相映的函数,比方说,将对 /home 的HTTP GET请求映射给 hello 类的 GET 函数;而对 /home 的 HTTP POST请求映射给 hello 类的POST函数。
 
这部分 url routing的设计与实现,各种语言、平台上的功能均向正则表达式靠拢,大同小异。
 
有的可能专门为 restful 做了优化,但即便木有,自行实现也并不复杂。
 
很多请求,都会有一些常用的默认处理,比方说,检查用户是否登陆,检查用户是否有权限等等。
 
这些业务控制逻辑,是完全可以复用的。
 
在Page Controller的场景下,一般是通过继承来实现;而Front Controller场景下,而一般通过函数修饰符的风格实现,如:
 
class UploadImgHandler(BaseHandler):  
 @tornado.web.authenticated  
 def post(self):  
  XXX
(上述代码,实际上既使用了继承,也使用了修饰符。)
 
Controller的改进,目的在于更加方便的维护代码、修改业务逻辑。

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读