在这里先给出廖雪峰老师给出的源码app.py,并且我按照自己的理解进行了相关的标注:
import logging; logging.basicConfig(level=logging.INFO)
import asyncio, os, json, time
from datetime import datetime
from aiohttp import web
#部署一个web服务器首先要创建一个请求处理器,请求处理器可以是普通方法,也可以是一个协程方法,
# 它只有一个用于接受Request实例对象的参数,之后返回Response实例对象
def index(request):
return web.Response(body=b'<h1>Awesome</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', 9000)#创建服务器
logging.info('server started at http://127.0.0.1:9000...')
return srv
loop = asyncio.get_event_loop()#从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行
loop.run_until_complete(init(loop))#把 init协程放到loop中执行
loop.run_forever()
但是在运行过程中出现了几个问题:
然后我就到浏览器中查看网址是否可以正常显示,结果如图所示:
说明页面还是有问题,在网上看了很多同学的讨论才知道需要在请求处理器返回的Resonse实例传入参数content_type=‘text/html’,否则会出现下载页面。
加上后效果如图所示:
可以看到,页面可以正常显示!
但是,虽然页面现在可以正常显示,控制台上的提示还有
仔细看提示:发现是
1.“@coroutine"的写法在python3.8之后已经被弃用,
2.loop 这样的写法也被弃用
3. Application.make_handler(…) 也被弃用。。。
所以,又将廖老师的写法进行了修改,如下图所示:
import logging
from aiohttp import web
import asyncio
logging.basicConfig(level=logging.INFO) #配置logging的基本信息,level=logging.INFO,记录INFO及以上的日志
#部署一个web服务器首先要创建一个请求处理器,请求处理器可以是普通方法,也可以是一个协程方法,
# 它只有一个用于接受Request实例对象的参数,之后返回Response实例对象
def index(request):
# return web.Response(body=b'<h1>Awesome<h1>')
return web.Response(body=b'<h1>Awesome<h1>',content_type='text/html')
#@asyncio.coroutine
async def init(event_loop):
app = web.Application(loop=event_loop)
app.router.add_route('GET', '/', index)
apprunner = web.AppRunner(app) # 构造AppRunner对象
await apprunner.setup() # 调用setup()方法,注意因为源码中这个方法被async修饰,所以前面要加上await,否则报错
srv = await event_loop.create_server(apprunner.server, '127.0.0.1', 9001)# 将apprunner的server属性传递进去
logging.info('server started at http://127.0.0.1:9001...')
return srv
loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()
还是有loop被弃用这个提示,虽然不影响,但是还是想把它给去掉。在这里留下这个小疑问。