我們的Web App建立在asyncio的基礎(chǔ)上,因此用aiohttp寫一個(gè)基本的app.py:
# 創(chuàng)建連接池
import logging # 記錄錯(cuò)誤信息
logging.basicConfig(level=logging.INFO) # 指定info級(jí)別通知
import asyncio, os, json, time
from datetime import datetime
from aiohttp import web
# 編寫處理函數(shù)
def index(request): # 該函數(shù)的作用是處理URL,之后將與具體URL綁定。參數(shù),aiohttp.web.request實(shí)例,包含了所有瀏覽器發(fā)送過來的 HTTP 協(xié)議里面的信息,一般不用自己構(gòu)造
return web.Response(body=b'<h1>Awesome</h1>',content_type='text/html') # response反饋回服務(wù)器網(wǎng)頁信息,網(wǎng)頁的HTML源碼就在Body中
# 返回值,aiohttp.web.response實(shí)例,由web.Response(body=‘‘)構(gòu)造,繼承自StreamResponse,功能為構(gòu)造一個(gè)HTTP響應(yīng)
#類聲明 class aiohttp.web.Response( *, status=200, headers=None, content_type=None, body=None, text=None)
# HTTP 協(xié)議格式為: POST /PATH /1.1 /r/n Header1:Value /r/n .. /r/n HenderN:Valule /r/n Body:Data
# 創(chuàng)建Web服務(wù)器,并將處理函數(shù)注冊(cè)進(jìn)其應(yīng)用路徑(Application.router)
async def init(loop):
app = web.Application(loop=loop) # 創(chuàng)建Web服務(wù)器實(shí)例app,也就是aiohttp.web.Application類的實(shí)例,該實(shí)例的作用是處理URL、HTTP協(xié)議
app.router.add_route('GET', '/', index)
# 將處理函數(shù)注冊(cè)到創(chuàng)建app.router中,router,默認(rèn)為UrlDispatcher實(shí)例,UrlDispatcher類中有方法add_route(method, path, handler, *, name=None, expect_handler=None),該方法將處理函數(shù)(其參數(shù)名為handler)與對(duì)應(yīng)的URL(HTTP方法metho,URL路徑path)綁定,瀏覽器敲擊URL時(shí)返回處理函數(shù)的內(nèi)容
srv = await loop.create_server(app.make_handler(), '127.0.0.1', 9000) # 用協(xié)程創(chuàng)建監(jiān)聽服務(wù),并使用aiohttp中的HTTP協(xié)議簇(protocol_factory)
# yield from 返回一個(gè)創(chuàng)建好的,綁定IP、端口、HTTP協(xié)議簇的監(jiān)聽服務(wù)的協(xié)程。yield from的作用是使srv的行為模式和 loop.create_server()一致
logging.info('server started at http://127.0.0.1:9000...')
return srv
'''
1.1 Application,構(gòu)造函數(shù)
def __init__(self, *, logger=web_logger, loop=None,router=None, handler_factory=RequestHandlerFactory,middlewares=(), debug=False):
1.2使用app時(shí),首先要將URLs注冊(cè)進(jìn)router,再用aiohttp.RequestHandlerFactory 作為協(xié)議簇創(chuàng)建套接字
1.3 aiohttp.RequestHandlerFactory 可以用 make_handle() 創(chuàng)建,用來處理 HTTP 協(xié)議,接下來將會(huì)看到
'''
loop = asyncio.get_event_loop() # 創(chuàng)建協(xié)程,loop = asyncio.get_event_loop(),為asyncio.BaseEventLoop的對(duì)象,協(xié)程的基本單位。
loop.run_until_complete(init(loop)) # 運(yùn)行協(xié)程,直到完成,BaseEventLoop.run_until_complete(future)
loop.run_forever() # 運(yùn)行協(xié)程,直到調(diào)用 stop(),BaseEventLoop.run_forever()