廖雪峰python3实例教程d1-d3


参考原文:http://www.liaoxuefeng.com/

D1: 开发环境搭建

注:windows环境中pip命令请直接在cmd运行,不要在python中运行,python3.x自带pip无需自行安装

D2: 编写Web App骨架

该Web App建立在asyncio的基础上,因此用aiohttp写一个基本的app.py:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

__author__ = 'Michael Liao'

'''
async web application.
'''

import logging; logging.basicConfig(level=logging.INFO)

import asyncio, os, json, time
from datetime import datetime

from aiohttp import web

def index(request):
    return web.Response(body=b'<h1>Awesome</h1>')

async def init(loop):
    app = web.Application(loop=loop)
    app.router.add_route('GET', '/', index)
    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()

运行python app.py,Web App将在9000端口监听HTTP请求,并且对首页/进行响应:

$ python3 app.py
INFO:root:server started at http://127.0.0.1:9000...

这里我们简单地返回一个Awesome字符串,在浏览器中看到如下效果说明说明我们的Web App骨架已经搭建完成,可以进一步往里面添加更多东西.

预览

D3: 编写ORM

在一个web app中,所有数据包括用户信息,发布信息,评论等都存储在数据库中。这里我们选择Mysql作为数据库。

web app里面有很多地方都要访问数据库。访问数据库需要创建数据库连接、游标对象、然后执行SQL语句,最后处理异常,清理资源。这些访问数据库的代码如果分散到各个函数中,势必无法维护,也不利于代码复用。

所以,我们首先把常用的SELECT、INSERT、UPDATE和DELETE操作用函数封装起来。

由于web框架使用了基于asyncio的aiohttp,这是基于协程的异步模型。在协程中,不能调用普通的同步IO操作,因为所有用户都是由一个线程服务的,协程的执行速度必须非常快,才能处理大量用户的请求。而耗时的IO操作不能在协程中以同步的方式调用,否则,等待一个IO操作时,系统无法响应任何其他用户。

这就是异步编程的一个原则:一旦决定使用异步,则系统每一层都必须是异步。幸运的是aiomysql为Mysql数据库提供了异步IO的驱动。

SQL语句的占位符?,而Mysql的占位符是%sselect()函数在内部自动替换。注意要始终坚持使用带参数的SQL,而不是自己拼接SQL字符串,这样可以防止SQL注入攻击。

execute()函数和select()函数所不同的是,cursor对象不返回结果集,而是通过rowcount返回结果数。

注意到定义在User类中的__table__,idname是类的属性,不是实例的属性。所以,在类级别上定义的属性用来描述User对象和表的映射关系,而实例属性必须通过__init__()方法去初始化,所以两者互不干扰:

    # 创建实例:
    user = User(id=123, name='Michael')
    # 存入数据库:
    user.insert()
    # 查询所有User对象:
    users = User.findAll()

ORM这一章实在看不懂,抄都抄不下去了……