MVC:Model-View-Controller,中文名「模型-視圖-控制器」。
其中Python處理的URL函數就是C:Controller,Controller主要負責業務邏輯,好比檢查用戶名是否存在,取出用戶信息等等;
而View負責顯示邏輯,經過一些簡單的替換變量,View生成最終用戶看到的HTML
,那View實質就是HTML
模板(如Django
等),而在本次Web開發就是Jinja2
模板;
Model是用來傳給View的,這樣View在替換變量的時候,就能夠從Model中取出相應的數據。html
經過上幾篇文章,咱們完成了ORM框架以及Web框架還有配置文件,如今能夠編寫一個MVC,把它們啓動起來。其實以前文章的小測試運行就是一個MVC,只是這一次編寫的MVC,把ORM框架以及Web框架串聯起來,再添加一個Jinja
模板,啓動運行。
編寫MVC:python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Seiei'
''' 串聯ORM框架以及Web框架編寫MVC,用於測試運行 '''
from web_app.webframe import get,post
import asyncio
from web_app.models import User #引入orm框架的User模型
@get('/')
async def index(request):
users = await User.findall()
return {
'__template__':'text.html',
'users':users
} #不懂就查看Web框架的middleware裏的Response_factory源碼以及Jinja2初始化的源碼,__template__是用來辨認出返回數據是Jinja2模板,而不是Json,同時能夠從初始化Jinja2那裏獲取Environment,從而導進名叫text.html的模板;而dict中的users是傳遞給模板的數據
而後就要編寫Jinja2
模板了,參考網站:Jinja2,Jinja2簡要web
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Test users - Awesome Python Web App</title>
</head>
<body>
<h1>ALL users</h1>
{% for u in users %}
<p>{{ u.name }} / {{ u.email }}</p>
{% endfor %}
</body>
</html>
最後對Day5文章最後編寫的測試運行代碼稍做修改,運行:數據庫
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Seiei'
''' 編寫web框架測試 '''
from aiohttp import web
import asyncio
from web_app.webframe import add_routes,add_static
from web_app.middleware_factories import init_jinja2,datetime_filter,logger_factory,response_factory
import logging; logging.basicConfig(level=logging.INFO)
from web_app import orm
from web_app.configs.config import config
async def init(loop):
await orm.create_pool(loop, **config['db'])#建立數據庫鏈接池,參數導入配置文件
app = web.Application(loop=loop,middlewares=[logger_factory,response_factory])
init_jinja2(app,filters=dict(datetime=datetime_filter),path = r"E:\learningpython\web_app\templates")#初始化Jinja2,這裏值得注意是設置文件路徑的path參數
add_routes(app,'web_app.MVC_test_handler_V2')#導入URL處理函數
add_static(app)
srv = await loop.create_server(app.make_handler(),'127.0.0.1',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()
最後瀏覽器打開http://127.0.0.1:9000/
,大功告成~api