python3 web框架(三、MVC与MTV)

本文详细介绍了如何使用Python构建Web应用,并逐步解释了MVC模式的实现过程,包括模型(Model)、视图(View)和控制器(Controller)各部分的作用及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇:python3 web框架(二、关于web框架理解)

我们已经写完了一个简单的web框架,那么这里

def handle_index():
    return ["<h1>hello web</h1>".encode('utf-8')]
 

返回的内容我们是自已一字符串的形式写出来的,那么还可以去一个文件里读取写好的内容,我们可以这么操作。

同级目录下新建一个名为 index.html 的文件 

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>hello web</h1>
</body>
</html>

然后我们访问的之后直接读取这个文件就可以了

app.py

from wsgiref.simple_server import make_server 
 
def handle_index():
    f=open('index.html',mode='rb')
    data = f.read()
    f.close()
    return [data,]
 
#def handle_hello():
#    return ["<h1>here is hello</h1>".encode('utf-8')]
 
#def handle_data():
#    return ["<h1>here is data</h1>".encode('utf-8')]
 
#对应关系
URL_DICT = {
        '/':handle_index,
            }
#URL_DICT = {
#        '/':handle_index,
#        '/hello':handle_hello,
#        '/data':handle_data,
#            }



def handle_request(env, res):
    res("200 OK",[("Content-Type","text/html")]) 
    acqu_url = env['PATH_INFO']#
    #body = "<h1>127.0.0.1:8000%s</h1>"%str(acqu_url)
 
    func = None
    if acqu_url in URL_DICT:
        func = URL_DICT[acqu_url]
    if func:
        return func()
    else:
        return ["<h1>404</h1>".encode('utf-8')]
 
#    return [body.encode('utf-8')] 
    
if __name__ == "__main__": 
    httpd = make_server("127.0.0.1",8000,handle_request) 
    print("Serving http on port 8000") 
    httpd.serve_forever() 

但是这样做的话,我们现在的目录结构是这个样子的

这里我们才一个url如果很多url 很多html文件,那么目录就很混乱,此时我们选择新建一个文件夹 View 来存放html文件。我们app.py中这里也要做相应的改动:

def handle_index():
    f=open('View/index.html',mode='rb')
    data = f.read()
    f.close()
    return [data,]

这样做完了以后我们又发现一个问题,我们app.py中 像 handle_index() 这样的函数很多的话,我们的代码还是很乱,那么我们还应该把这样的函数独立整理出来,我们新建一个文件夹Controller,在Controller下新建一个urls_res.py文件来写这样的函数;

urls_res.py

def handle_index():
    f=open('View/index.html',mode='rb')
    data = f.read()
    f.close()
    return [data,]

app.py

from wsgiref.simple_server import make_server 
from  Controller import urls_res

#对应关系
URL_DICT = {
        '/':urls_res.handle_index,
            }
#这里路由改一下

def handle_request(env, res):
    res("200 OK",[("Content-Type","text/html")]) 
    acqu_url = env['PATH_INFO']#
    #body = "<h1>127.0.0.1:8000%s</h1>"%str(acqu_url)
 
    func = None
    if acqu_url in URL_DICT:
        func = URL_DICT[acqu_url]
    if func:
        return func()
    else:
        return ["<h1>404</h1>".encode('utf-8')]
 
#    return [body.encode('utf-8')] 
    
if __name__ == "__main__": 
    httpd = make_server("127.0.0.1",8000,handle_request) 
    print("Serving http on port 8000") 
    httpd.serve_forever() 

目录结构

这个时候如果需要写业务代码,就在Controller里新建文件,如果需要添加模板,往View里面添加就可以了。

写到这里我们发现好像忘记了什么?——————数据库

我们在html中写上一个特殊的语句跟数据库中的数据进行替换,比如在 hello web 后面写上@abc:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>hello web @abc</h1>
</body>
</html>

我们在读完 index.html文件后 做个替换。

urls_res.py

def handle_index():
    f=open('View/index.html',mode='rb')
    data = f.read()
    data = data.replace('@abc'.encode('utf-8'),'here is abc'.encode('utf-8'))#假设这里'here is abc'是数据库中的数据,我们把@abc替换为这条数据
    
    f.close()
    return [data,]

这里我们没有进行数据库操作直接使用的一个假设的数据来进行替代,实际上如果我们想使用数据库中的数据还要在handle_index()函数中进行数据库的操作,但是这样一来,我们的urls_res.py中的代码又会变得很混乱,为了解决这个问题,我们再建一个文件夹Modle, 在Modle新建文件来写代码进行数据库的操作。

解决的上述问题,我们新建了三个文件夹  Modle 、 View 和 Controller。

这三个文件夹都有自己相对应的功能Modle--数据库操作、 View--模板文件 和 Controller--业务处理,而他们的首字母合起来就叫 MVC ,这就是MVC,对文件的分类,对功能的划分。

而MTV跟MVC 本质上是一样的,只不过文件夹的名字不一样,MTV中的M也是Modle,进行数据库操作;T指Template ,里面存放的是模板文件;V也叫View,但是这里的View是业务处理。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值