1. 程式人生 > >Python廖雪峰實戰web開發(Day7-編寫MVC)

Python廖雪峰實戰web開發(Day7-編寫MVC)

MVC:Model-View-Controller,中文名“模型-檢視-控制器”。
其中Python處理的URL函式就是C:ControllerController主要負責業務邏輯,比如檢查使用者名稱是否存在,取出使用者資訊等等;
View負責顯示邏輯,通過一些簡單的替換變數,View生成終端使用者看到的HTML,那View實質就是HTML模板(如Django等),而在本次Web開發就是Jinja2模板;
Model是用來傳給View的,這樣View在替換變數的時候,就可以從Model中取出相應的資料。

通過上幾篇文章,我們完成了ORM框架以及Web框架還有配置檔案,現在可以編寫一個MVC

把它們啟動起來。其實之前文章的小測試執行就是一個MVC,只是這一次編寫的MVC,把ORM框架以及Web框架串聯起來,再新增一個Jinja模板,啟動執行。
編寫MVC

#!/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

模板了,參考網站:Jinja2Jinja2簡要

<!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/,大功告成~