因此,Web框架的设计是完全从使用者出发,目的是让使用者编写尽可能少的代码。 编写简单的函数而非引入request和web.Response还有一个额外的好处,就是可以单独测试,否则, 需要模拟一个request才能测试 ''' ''' ------------------------------------------------------- @get和@post 要把一个函数映射为一个URL处理函数,我们先定义@get(): ''' import asyncio, os, inspect, functools import loggingTools logger = loggingTools.getLogger('mylogger') from urllib import parse from aiohttp import web from apis import APIError def get(path) : ''' Define decorator @get('/path') ''' def decorator(func) : @functools.wraps(func) def wrapper(*args, **kw) : return func(*args, **kw)
这就是异步编程的一个原则:一旦决定使用异步,则系统每一层都必须是异步,“开弓没有回头箭”。 幸运的是aiomysql为MySQL数据库提供了异步IO的驱动。 创建连接池 我们需要创建一个全局的连接池,每个HTTP请求都可以从连接池中直接获取数据库连接。 使用连接池的好处是不必频繁地打开和关闭数据库连接,而是能复用就尽量复用。 连接池由全局变量__pool存储,缺省情况下将编码设置为utf8,自动提交事务: ''' import asyncio, aiomysql import loggingTools logger = loggingTools.getLogger('ormlogger') def log(sql, args = ()) : logger.info('SQL: %s' % sql) @asyncio.coroutine def create_pool(loop, **kw) : logger.info('create database connection pool...') global __pool __pool = yield from aiomysql.create_pool( host = kw.get('host', 'localhost'), port = kw.get('port', 3306), #mysql默认端口3306 user = kw['user'], password = kw['password'], db = kw['db'], charset = kw.get('charset', 'utf8'),