MVC
:
Model-View-Controller
,“模型-视图-控制器”。
Controller 控制器
:控制业务逻辑,决定与前端进行数据交互的形式和方法。如:检查数据,存取数据等。
View 视图
:复制显示页面。通过接收
Controller
传来的数据,渲染后,呈现界面给用户。
Model 模型
:它是在后端
Controller
和前端View之间被传递的数据。
在本项目中:
Model
是我们编写的
orm框架
,它能从MySQL中取出数据,并以对象的形式被传递。
View
是我们使用的
jinja2模板引擎
,他能接收从后端传来的数据,渲染呈现出页面。
Controller
是我们的
视图函数
,以及用来封装视图函数的
HandRequest
类和
middlerware
等。
在之前我们已经编写过orm框架,完成了配置文件,并且对jinja2模板引擎进行了初始化。
所以,现在可以编写一个MVC测试把他们联动起来~
之前的测试,视图函数仅返回字符串,现在我们要让它调用jinja2模板,并和前端有数据传递。
首先,修改一下之前编写的测试用视图函数:
from coroweb import get
from models import User
import asyncio
@get('/')
async def index(request):
users = await User.findAll()
# 视图函数返回的值是dict
return {
# 在response_middleware中会搜索模板
'__template__': 'test.html',
# 传入模板的数据
'users': users
}
然后,编写一个jinja2模板
test.html
,放入templates文件夹中:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test users - Awesome Python Webapp</title>
</head>
<body>
<h1>All users</h1>
{% for u in users %}
<p>{{ u.name }} / {{ u.email }}</p>
{% endfor %}
</body>
</html>
最后,对Day 5中初始化app的函数修改,启动orm框架 :
import asyncio, os, json, time, logging
import orm
from config import configs
from datetime import datetime
from aiohttp import web
from jinja2 import Environment, FileSystemLoader
from coroweb import add_route, add_routes, add_static
if __name__ == '__main__':
async def init(loop):
await orm.create_pool(loop, **configs['db']) # 添加配置文件
app = web.Application(loop = loop, middlewares=[logger_factory, response_factory])
init_jinja2(app, filters=dict(datetime = datetime_filter))
add_routes(app, 'test_view')
add_static(app)
srv = await loop.create_server(app.make_handler(), 'localhost', 9000)
logging.info('server started at http://127.0.0.1:9000...')
return srv
loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()
在开始运行前,别忘了在MySQL的users表中传入数据。
然后,运行,访问localhost:9000。
虽然显示页面非常简陋,但我们已经完成一次MVC联动了~