aiohttp的使用杂记

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值