码迷,mamicode.com
首页 > Web开发 > 详细

web框架以及MVC、MTV

时间:2017-04-04 20:57:23      阅读:1767      评论:0      收藏:0      [点我收藏+]

标签:gateway   数据库   info   diesel   forever   imp   状态   方式   改变   

本篇内容概要

----原始web框架
----自定义web框架
----mvc和mtv

一、web框架的本质

 对于所有的web应用,本质上其实就是一个socket服务端,用户的浏览器就是一个socket客户端

简单的说就是,socket传入数据,之后后面是业务逻辑处理程序

技术分享

画得不好,理解就好

二、引入WSGI

 

由于web框架包括两部分
1、socket
2、逻辑处理
有些框架只有逻辑处理,没有socket,如flask、bottle、Django
有些框架两部分都有,如tornado
那些没有socket的,需要去自己写或者引入第三方socket,由于没有固定的标准,所以比较混乱,这个时候WSGI就隆重登场了,
中文翻译 web服务网关接口
WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,
实现web app与web server间的解耦。

python标准库提供的独立WSGI服务器称为wsgiref。当还有其他的接口格式:

技术分享
cgi: CGIServer,
flup: FlupFCGIServer,
wsgiref: WSGIRefServer,
waitress: WaitressServer,
cherrypy: CherryPyServer,
paste: PasteServer,
fapws3: FapwsServer,
tornado: TornadoServer,
gae: AppEngineServer,
twisted: TwistedServer,
diesel: DieselServer,
meinheld: MeinheldServer,
gunicorn: GunicornServer,
eventlet: EventletServer,
gevent: GeventServer,
geventSocketIO:GeventSocketIOServer,
rocket: RocketServer,
bjoern : BjoernServer,
auto: AutoServer,
View Code

Django实现的wsgiref:

技术分享
#!/usr/bin/env python
#coding:utf-8
  
from wsgiref.simple_server import make_server
  
def RunServer(environ, start_response):
    start_response(200 OK, [(Content-Type, text/html)])
    return <h1>Hello world!</h1>
  
if __name__ == __main__:
    httpd = make_server(‘‘, 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()
View Code

上面模板引擎的参数

第一个参数environ代表封装的用户的所有的请求

第二个参数 start_response 代表返回的数据

三、自定义web框架

 目录结构如下:,view文件包里面是HTML文件

技术分享

controllar文件为

技术分享
#/usr/bin/env python
#-*- coding:utf-8 -*-
import os
def new():
    f=open(os.path.join("Views","s1.html"),"r")
    data=f.read()
    f.close()
    return data
def index():
    f=open(os.path.join("Views","index.html"),"r")
    data=f.read()
    f.close()
    return data
View Code

start文件为:

技术分享
#/bin/usr/env python
#-*- coding:utf-8 -*-
from wsgiref.simple_server import make_server

# from urls import URLS
import  controllar
def RunServer(environ,start_response):
    start_response(200 OK,[(Content-Type,text/html)])
    url=environ[PATH_INFO]

    if url== "/new":
        ret=controllar.new()
    elif url=="/index":
        ret=controllar.index()
    else:
        ret="404"
    return ret
    # if url in URLS.keys():
    #     func_name=URLS[url]
    #     ret=func_name()
    # else:
    #     ret=404
    # return ret

if __name__== "__main__":
    httpd=make_server("",81,RunServer)
    httpd.serve_forever()
View Code

上面的文件分别对应上图中的,HTML和和函数,以及socket

但是上面的代码只能返回给用户HTML的内容,但是没法返回动态内容,如何解决?后文分解

四、MVC模式:

 技术分享

所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起:
M.模型负责业务对象与数据库的映射(ORM)   (数据库相关操作)
V.视图负责与用户的交互(页面)      (模板HTML文件)
C.控制器接受用户的输入调用模型和视图完成用户的请求   (业务逻辑)

 技术分享

五、MTV模式

 

Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同
Django的MTV分别是值:
  • M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。
  • T 代表模板 (Template):负责如何把页面展示给用户(html)。
  • V 代表视图(View):负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:
技术分享
  1. Web服务器(中间件)收到一个http请求
  2. Django在URLconf里查找对应的视图(View)函数来处理http请求
  3. 视图函数调用相应的数据模型来存取数据、调用相应的模板向用户展示页面
  4. 视图函数处理结束后返回一个http的响应给Web服务器
  5. Web服务器将响应发送给客户端

 技术分享

这种设计模式关键的优势在于各种组件都是松耦合的。这样,每个由 Django驱动的Web应用都有着明确的目的,并且可独立更改而不影响到其它的部分。 
比如,开发者更改一个应用程序中的 URL 而不用影响到这个程序底层的实现。设计师可以改变 HTML页面的样式而不用接触Python代码。
数据库管理员可以重新命名数据表并且只需更改模型,无需从一大堆文件中进行查找和替换。
 
Django的MTV模式相对应的python文件如下:

 技术分享

如果不考虑内部原理一句话总结MVC和MTV :MTV ---MTV框架就是文件夹的归宿

 总结:

技术分享
1、    插件
2、    web框架
web框架的本质都是socket,通过字符串发送内容
发送字符串:
    第一块:协议和方式
    第二块:请求头
    第三块:发送内容hello
响应字符串:
    第一块:协议和状态 200
    第二块:响应头
    
    第三块:响应内容“hello”

python   web框架分类:
    自给自足:socket           ==》Tornado
    第三方:WSGI+框架
MVC.MTV    
    文件夹的归类
View Code

 

web框架以及MVC、MTV

标签:gateway   数据库   info   diesel   forever   imp   状态   方式   改变   

原文地址:http://www.cnblogs.com/pyrene/p/6665848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!