我们已经写完了一个简单的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是业务处理。