Example #1
0
因此,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)
Example #2
0
这就是异步编程的一个原则:一旦决定使用异步,则系统每一层都必须是异步,“开弓没有回头箭”。

幸运的是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'),