第一步,搭建开发环境

所需第三方库:

  aiohttp,异步 Web 开发框架;jinja2,前端模板引擎;aiomysql,异步 mysql 数据库驱动

所需内置库:

  logging,系统日志;asyncio,异步IO;os,系统接口;json,json 编码解码模块;time,系统时间模块;datetime,日期模块

  接下来仅对用到的功能进行讲解

第二步,构建 Web 框架

主要思路:

  理解 asyncio、aiohttp 基本应用

  使用 asyncio 异步 IO 模块创建服务协程,监听相应端口

  使用 aiohttp 异步 Web 开发框架,处理 HTTP 请求,构建并返回 HTTP 响应

完整代码:

 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>My Bolg</h1>') @asyncio.coroutine
def init(loop):
app = web.Application(loop=loop)
app.router.add_route('GET', '/', index)
srv = yield from loop.create_server(app.make_handler(), '127.0.0.1', )
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() CompleteCode

步骤解析:

一,编写处理函数

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

1.函数名随意取。该函数的作用是处理URL,之后将与具体URL绑定

  2.参数aiohttp.web.request实例,包含了所有浏览器发送过来的 HTTP 协议里面的信息,一般不用自己构造

     具体文档参见 http://aiohttp.readthedocs.org/en/stable/web_reference.html

  3.返回值aiohttp.web.response实例,由web.Response(body='')构造,继承自StreamResponse,功能为构造一个HTTP响应

     类声明 class aiohttp.web.Response(*, status=200, headers=None, content_type=None, body=None, text=None)

  4.HTTP 协议格式为: POST /PATH /1.1 /r/n Header1:Value  /r/n .. /r/n HenderN:Valule /r/n Body:Data

二,创建Web服务器,并将处理函数注册进其应用路径(Application.router)

app = web.Application(loop=loop)
app.router.add_route('GET', '/', index)

1.创建Web服务器实例app,也就是aiohttp.web.Application类的实例,该实例的作用是处理URL、HTTP协议

    1.1 Application,构造函数 def __init__(self, *, logger=web_logger, loop=None,

                       router=None, handler_factory=RequestHandlerFactory,
                         middlewares=(), debug=False):

    1.2使用app时,首先要将URLs注册进router,再用aiohttp.RequestHandlerFactory 作为协议簇创建套接字

    1.3 aiohttp.RequestHandlerFactory 可以用 make_handle() 创建,用来处理 HTTP 协议,接下来将会看到

  2.将处理函数注册到创建app.router中

    2.1 router,默认为UrlDispatcher实例,UrlDispatcher类中有方法add_route(method, path, handler, *, name=None, expect_handler=None),该方法将处理函数(其参数名为handler)与对应的URL(HTTP方法metho,URL路径path)绑定,浏览器敲击URL时返回处理函数的内容

三,用协程创建监听服务,并使用aiohttp中的HTTP协议簇(protocol_factory)

srv = yield from loop.create_server(app.make_handler(), '127.0.0.1', )

1.用协程创建监听服务,其中loop为传入函数的协程,调用其类方法创建一个监听服务,声明如下

   coroutine BaseEventLoop.create_server(protocol_factory, host=None, port=None, *, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None)

  2.yield from 返回一个创建好的,绑定IP、端口、HTTP协议簇的监听服务的协程。yield from的作用是使srv的行为模式和 loop.create_server()一致

四,创建协程,初始化协程,返回监听服务,进入协程执行

loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()

1.创建协程,loop = asyncio.get_event_loop(),为asyncio.BaseEventLoop的对象,协程的基本单位。

  2.运行协程,直到完成,BaseEventLoop.run_until_complete(future)

  3.运行协程,直到调用 stop(),BaseEventLoop.run_forever()

五,补充说明

  1.app,Application

  2.loop,WindowsSelectEventLoop

  3.srv,SocketSever

asyncio创建协程解析——分析廖雪峰的Python教程之创建WEB服务(转)的更多相关文章

  1. 廖雪峰老师Python教程读后笔记

    廖老师网站:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 花几天时间看了廖老师的 ...

  2. 进程 vs. 线程(python的协程)(转廖雪峰老师python教程)

    我们介绍了多进程和多线程,这是实现多任务最常用的两种方式.现在,我们来讨论一下这两种方式的优缺点. 首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Work ...

  3. python 协程(单线程中的异步调用)(转廖雪峰老师python教程)

    协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在 ...

  4. 【廖雪峰老师python教程】——进程与线程

    多进程 操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去.表面上看,每个任务都是交替执行的,但是,由于CPU ...

  5. 【廖雪峰老师python教程】——IO编程

    同步IO 异步IO 最常见的IO——读写文件 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一 ...

  6. 【廖雪峰老师python教程】——错误和调试

    错误处理 try...except...finally...机制 try: print('try...') r = 10 / 0 print('result:', r) except ZeroDivi ...

  7. 【廖雪峰老师python教程】——OOP

    概述 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 数据封装.继承和多态 ...

  8. 【廖雪峰老师python教程】——模块

    使用模块 任何模块代码的第一个字符串都被视为模块的文档注释: 使用__author__变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名: 当我们在命令行运行模块文件时,Python解释器把 ...

  9. 【廖雪峰老师python教程】day1

    主要内容摘要 函数参数[个人感觉难度很大,却很重要,可以先大概记一记]不要用的太复杂.戳这儿温习 递归函数:使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出.重点:找到递归关系和终止条件 ...

随机推荐

  1. Linux 字符设备驱动开发基础(二)—— 编写简单 PWM 设备驱动【转】

    本文转载自:https://blog.csdn.net/zqixiao_09/article/details/50858776 版权声明:本文为博主原创文章,未经博主允许不得转载.    https: ...

  2. Web Service平台有三种元素构成:SOAP、WSDL、UDDI。区别和联系

    Web Service平台有三种元素构成:SOAP.WSDL.UDDI.一个消费者可以在UDDI注册表查找服务,取得服务的WSDL描述,然后通过SOAP来调用服务.SOAP.WSDL.UDDI的区别如 ...

  3. AtCoder Beginner Contest 120 解题报告

    为啥最近都没有arc啊... A - Favorite Sound #include <algorithm> #include <iostream> #include < ...

  4. [jsp & thymeleaf] - jsp和thymeleaf的共存解析

    做项目时因为有些老jsp还需要测试用到,所以之前的thymeleaf也需要保持,配置如下: https://github.com/deadzq/jsp-thymeleaf 等空余时间在做详解吧!

  5. Python实现机器学习算法:感知机

    ''' 数据集:Mnist 训练集数量:60000 测试集数量:10000 ------------------------------ 运行结果: 正确率:81.72%(二分类) ''' impor ...

  6. -第2章 JS方法实现下拉菜单显示和隐藏

    知识点 onmouseover 鼠标经过 onmouseout 鼠标移出 function 关键字 getElementsByTagName 获取一组标签 length 获取对象成员个数 思路 给一级 ...

  7. CentOS7时间和日期的同步 (chrony和)

    CentOS 6版本,使用 hwclock CentOS 7版本,使用timedatectl 1.基本概念 1.1 GMT,UTC,CST,DST时间 世界标准时间 整个地球分为二十四时区,每个时区都 ...

  8. HDU 5727 Necklace(全排列+二分图匹配)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5727 题意:现在有n个阳珠子和n个阴珠子,现在要把它们串成项链,要求是阴阳珠子间隔串,但是有些阴阳珠 ...

  9. CSS3动画详解(结合实例)

    一.使用CSS3动画代替JS动画 JS动画频繁操作DOM导致效率非常低 在频繁的操作DOM和CSS时,浏览器会不停的执行重排(reflow)和重绘(repaint) 可以避免占用JS主线程 这边就不细 ...

  10. excel 获取当前日期

    获取第几周(如第12周) ="第"&WEEKNUM(TODAY())&"周" 获取星期几(如星期一) =TEXT(TODAY(),"a ...