aiohttp建立server
实现aiohttp的web server的核心关键,是实现一个个request handler, rh必须是协程, 其参数是client发送过来的request,并且返回一个Response实例。
举例如下
from aiohttp import web
async def hello(request):
return web.Response(text="Hello, world")
app = web.Application()
app.add_routes({web.get('/', hello)})
web.run_app(app) #运行名为app的程序。
hello就是一个request handler, 其参数是request,接收后,一般是解析request中的信息,进行处理,然后返回给client消息。
上述代码,返回了"Hello, world"的字符串给请求的client。app是创建一个服务器应用。而app.add_routes()是添加相应的url。
对于json数据的处理
用户请求的东西如果是json,那么必然会对json进行解析。 提取出其中的关键信息,然后再根据关键信息进行处理,返回request需要的信息。
aiohttp.web提供了json_response()方法,其中输入的参数是一个json对象。
async def handler(request):
data = {'some':'data'}
return web.json_response(data)
这样,就把json返回给了client。
如何session会话
具有记忆性质的请求和回应被称作会话,即session。对于aiohttp.web来说,需要使用第三方库aiohttp_session,它增加了会话支持。
import asyncio
import time
import base64
from cryptography import fernet
from aiohttp import web
from aiohttp_session import setup,get_session,session_middleware
frome aiohttp_session.cookie_storage import EncryptedCookieStorage
async def handler(request):
session = await get_session(request) #得到请求并且存入
last_visit = session['last_visit'] if 'last_visit' in session else None
text = 'Last visited:{}'.format(last_visit)
return web.Response(text=text)
如何在server.py中增加session处理
服务器的部署
aiohttp部署是如何的,要部署aiohttp.web.run_app(),并传递aiohttp.web.Application实例即可。该方法最简单,也是在比较小的程序中最好的解决方法。但该方法并不能完全利用CPU,如果要运行多个aiohttp服务器,需要使用反向代理。
一般来说,创建一个应用的方法:
from aiohttp import web
async def hello(request):
return web.Response(text='Hello Aiohttp')
app = web.application() #创建一个应用
app.router.add_get('/hello',hello) #将hello这个requestHandler 的url设为 localhost/hello
web.run_app(app, host='0.0.0.0', post=9000) #传入app, 设定host和端口
这样,启动服务器
curl -X GET localhost:9000/hello
便可以看见“Hello world”显示于终端了。
webSockets的使用
websocket是一种网络通信协议,和http一样是一种应用层协议。http协议有一个缺陷,通信只能是客户端发起的,服务端返回查询结果。比如说,一个事件的动态,如果我想不断掌握动态,客户端就得不断刷新,不断请求服务器返回较新的结果。websocket是双向通信协议,可以使得服务器主动推送消息给client。
websocket(websockets如https一样,是加密的websocket协议)可以在客户端和服务端之间建立一个非http的双向连接,该连接是实时的,永久的(有状态的,有记忆的,不用每次重新建立连接),只要客户端有一个被打开的socket并且与服务器建立连接,服务器就可以把数据布顿啊推送到socket上。
websocket接受的网络参数是url,然后调用websocket对象的构造器建立与服务器之间的通信连接。
url字符串必须以ws或者wss开头。比如
var websocket = new WebSocket(wss://echo.websocket.org)
websocket.send()是发送信息,一般参数是json格式的文本。
aiohttp.web友好支持websockets。server端需要创建WebSocketResponse
async def websocket_handler(request):
ws = web.WebSocketResponse() #创建socketResponse
await ws.prepare(request)
async for msg in ws: #对ws中的消息进行迭代
if msg.type == aiohttp.WSMsgType.TEXT:
if msg.data == 'close':
await ws.close()
else:
await ws.send_str(msg.data + '/answer')
elif msg.type == aiohttp.WSMsgType.ERROR:
print('ws connection closed with exception %s' %
ws.exception())
print('websocket connection closed')
return ws
文件上传
aiohttp.web内置支持处理从浏览器上传的文件
gunicorn
gunicorn是一个高效的python服务器,用之来运行wsgi application,或者wsgi framework,地位相当于java中的Tomcat
content和text的区别,content是byte类型,原生字符串,text是经过解码之后的字符
参考文档
websocket的介绍https://blog.csdn.net/chansoncc/article/details/83656378
aiohttp-server快速入门中文翻译版(一) https://www.cnblogs.com/zhaof/p/9919822.html
aiohttp文档 https://www.cntofu.com/book/127/aiohttp%E6%96%87%E6%A1%A3/ServerDeployment.md
aiohttp服务端编程详解 https://www.jianshu.com/p/6b420f562f87