Python廖雪峰实战web开发(Day

发布时间:2019-08-29 07:42:47编辑:auto阅读(1899)

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

关键字