浅谈python_web的MVC和MTV

一、作者感悟

之前学了java,可以简单的用ssm框架写点网页,后来入黑盒测试,自学了python,但说实话我更比较喜欢java那种规规矩矩,现在只是自己 写个脚本爬虫更多的会用python灵活

二、什么是MVC、MTV

python 的MVC和java的一样,分别是Model、View、Controller,也就是我们通常说的模型(model)-视图(view)-控制器(controller),分别对应着数据库、模板文件、业务处理。
MTV 分别是 Model、Template、View,分别对应的是数据库、模板文件、业务处理,python Django,用的就是MTV模式

三、初识python 的web流程

要知道代码的逻辑关系,和数据走向,这是我当时学java ssm框架时候心得,python 自学也从这句话开始.
WSGI(Web Server Gateway Interface),python标准库提供的独立WSGI服务器称为wsgiref。

from wsgiref.simple_server import make_server

def RunServer(environ, start_response):
    #environ 客户发来的所有信息 environ['PATH_INFO']获取地址
    #start_response 返回响应信息

    start_response('200 OK',[('Content-Type', 'text/html')])
    return ['

Python

'.encode('utf-8')] if __name__ == '__main__': httpd = make_server('',8000,RunServer) httpd.serve_forever()

访问http://127.0.0.1:8000/,就能看到页面python
下一步要做的就是,有多个页面对应多个响应信息,environ是个字典,里面就有从客户端返回的地址信息environ['PATH_INFO']

from wsgiref.simple_server import make_server

def RunServer(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    current_url =  environ['PATH_INFO']

    #http://127.0.0.1:8000/index
    if current_url == '/index':
        return ['

welcome

'.encode('utf-8')] #http://127.0.0.1:8000/data elif current_url == '/data': return ['

DATa

'.encode('utf-8')] #必须写,因为客户端会给服务器端发送/favicon.ico 也就是ico图片 else: return ['

404

'.encode('utf-8')] if __name__ == '__main__': httpd = make_server('',8000,RunServer) httpd.serve_forever()

else 是必须写的因为客户端会返回/favicon.ico 这样我们的代码可以对他做判断,上面的代码其实我们可以吧 /index 和/data 写成函数如下:

from wsgiref.simple_server import make_server
#/data
def handle_data():
    return ['

DATa

'.encode('utf-8')] #/index def handle_index(): return ['

welcome

'.encode('utf-8')] def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) current_url = environ['PATH_INFO'] #http://127.0.0.1:8000/index if current_url == '/index': return handle_data() #http://127.0.0.1:8000/data elif current_url == '/data': #必须写,因为客户端会给服务器端发送/favicon.ico 也就是ico图片 return handle_index() else: return ['

404

'.encode('utf-8')] if __name__ == '__main__': httpd = make_server('',8000,RunServer) httpd.serve_forever()

要是 20个网页我们就给写20个if判断么,这时候我们就可以用字典来解决这个问题

from wsgiref.simple_server import make_server

def handler_index():
    return ['index'.encode('utf-8')]

def handler_data():
    return ['data'.encode('utf-8')]

#用字典封装方法
URL_DICT = {
    '/data' : handler_data,
    '/index' : handler_index,
}

def RunServer(environ, start_response):
    #environ 客户端返回
    #start_response 服务器端响应给用户

    start_response('200 OK',[('Concent-Type', 'text/html')])
    current_url = environ['PATH_INFO']
    fun = None
    #先用变量接收
    if current_url in URL_DICT:
        fun = URL_DICT[current_url]
    if fun:
        return fun()
    else:
        return ['404'.encode('utf-8')]

if __name__ == '__main__':
    httpd = make_server('',8000,RunServer)
    httpd.serve_forever()

我的网页要是有很多内容怎么办,总不能在return 全拼出来吧,这时候就是MVC登场了


image.png

首先我们创建一个文件夹叫Controller,这里面是处理层,我们把刚才的写的响应给用户展示的方法放在account.py 文件


#用io 读的方法,去读取放在VIEW层的页面
def handler_index():
    with open('/views/index','rb') as f:
        data = f.read()

       #替换html内容 data.replace()
        f.close()
        return [data,]


def handler_data():
    return ['data'.encode('utf-8')]

我们创建一个VIEWS层,里面用来存放我们的html
我们在写一个入口

from wsgiref.simple_server import make_server

#却controller 读取我们的 方法
from Controller import account

#用字典封装方法
URL_DICT = {
    '/data' : account.handler_data,
    '/index' : account.handler_index,
}

def RunServer(environ, start_response):
    #environ 客户端返回
    #start_response 服务器端响应给用户

    start_response('200 OK',[('Concent-Type', 'text/html')])
    current_url = environ['PATH_INFO']
    fun = None
    #先用变量接收
    if current_url in URL_DICT:
        fun = URL_DICT[current_url]
    if fun:
        return fun()
    else:
        return ['404'.encode('utf-8')]

if __name__ == '__main__':
    httpd = make_server('',8000,RunServer)
    httpd.serve_forever()

你可能感兴趣的:(浅谈python_web的MVC和MTV)