使用Python版本3.7,异步框架aiohttp
,前端模板引擎jinja2
,MySQL的Python异步驱动程序aiomysql
我们的Web App建立在asyncio的基础上,因此用aiohttp写一个基本的app.py
,参照aiohttp的官方文档:
from aiohttp import web
async def hello(request):
return web.Response(body=b'Hello world!
', content_type='text/html')
app = web.Application()
app.add_routes([web.get('/', hello)])
web.run_app(app, host='127.0.0.1', port=8080)
async
表示异步协程,await
表示yield from
ORM全称是Object-Relational Mapping,也就是把数据库中的数据于程序中的对象Object直接联系起来,这样做的好处是可以把操作数据库的SQL语句封装,直接操作object就可以达到操作数据库的目的。
在Python中,要实现ORM需要用到元类型,也就是Metaclass
。所谓的metaclass
就是定义类的类,参考type和metaclass
为了创建ORM,我们需要做到的是动态地创建类的参数。其运行流程步骤如下:
User
类包含有id, email, passwd, ...
,这些属性对应为StringField, IntegerField, bool, FloatField
等。User
类时,会先创建其父类Model
,父类中指定metaclass=ModelMetaclass
,调用ModelMetaclass.__new__(cls, name, bases, attrs)
。attrs
中包含有User
类中定义的各种属性,在ModelMetaclass.__new__
方法中,检测这些属性是否对应为数据库里的列(是Field
类的实例),如果是,就保存属性与列的映射关系,同时在类中添加一些参数,例如__table__
表名,__select__
,__insert__
等SQL语句的写法。这些SQL语句根据attrs
中的属性而创建的。Model
类中,定义findAll
,save
,update
,remove
等函数,这些函数中可以用到Metaclass
中提供的SQL语句。这样做的好处是不用为数据库中的每一个表都写对应的SQL语句来实现CRUD操作。其他注意事项:
?
,在Python中使用%s
。where
, order by
等,把这些内容附加在__select__
后即可。详细的Code参考day-4