aiohttp--web框架、session、路由、cryptography
2019.7.23:
内容:aiohttp.web 、aiohttp_session、cryptography、其余没有涉及的到文档网站上查询
AIOHTTP--用于asyncio和Python的异步HTTP客户端/服务器
用于快速DNS解析的可选 aiodns
支持非阻塞异步I/O的库
以下是服务器端的配置:
一、配置请求处理器和路由:
二、静态文件的处理
三、返回JSON相应
四、处理用户会话
aiohttp.web
没有内置会话,不过你可以使用第三方库aiohttp_session
来提供会话支持
https://github.com/aio-libs/aiohttp-session
该库允许我们将用户特定的数据存储到会话对象中。
会话对象具有类似dict的接口(诸如session [key] = value,value = session [key]等的操作存在)。
在Web处理程序中处理会话之前,必须在aiohttp.web.Application中注册会话中间件。
举个栗子:
import time import base64 from cryptography import fernet from aiohttp import web from aiohttp_session import setup, get_session from 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 session['last_visit'] = time.time() text = 'Last visited: {}'.format(last_visit) return web.Response(text=text) def make_app(): app = web.Application() # secret_key must be 32 url-safe base64-encoded bytes fernet_key = fernet.Fernet.generate_key() secret_key = base64.urlsafe_b64decode(fernet_key) setup(app, EncryptedCookieStorage(secret_key)) app.router.add_get('/', handler) return app web.run_app(make_app())
(题外话):from cryptography import fernet
cryptography是python语言中非常著名的加解密库,在算法层面提供了高层次的抽象,使用起来非常简单、直观,pythonic,同时还保留了各种不同算法的低级别接口,保留灵活性。
我们知道加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption)。各自对应多种不同的算法,每种算法又有不同的密钥位长要求,另外还涉及到不同的分组加密模式,以及末尾补齐方式。因此需要高层次的抽象,把这些参数封装起来,让我们使用时,不用关心这么多参数,只要知道这么用足够安全就够了。
对称加密又分为分组加密和序列加密,本文只讨论对称分组加密。
主流对称分组加密算法:DES、3DES、AES
主流对称分组加密模式:ECB、CBC、CFB、OFB
主流填充标准:PKCS7、ISO 10126、ANSI X.923、Zero padding
在cryptography库中,对称加密算法的抽象是fernet模块,包括了对数据的加解密以及签名验证功能,以及密钥过期机制。
该模块采用如下定义:
- 加解密算法为AES,密钥位长128,CBC模式,填充标准PKCS7
- 签名算法为SHA256的HMAC,密钥位长128位
- 密钥可以设置过期时间
(回到aiohttp_session)
所有存储都使用名为AIOHTTP_SESSION的HTTP Cookie来存储数据。 可以通过将关键字参数cookie_name传递给您选择的存储类来修改此问题。
可用的会话存储是:
- aiohttp_session.SimpleCookieStorage() -- 将会话数据保存为cookie主体中的普通JSON字符串。 仅将存储用于测试目的,它非常不安全。
aiohttp_session.cookie_storage.EncryptedCookieStorage(secret_key)
-- 将会话数据作为SimpleCookieStorage存储到cookie中,但通过AES密码对其进行编码。 secrect_key是AES加密/解密的字节密钥,长度应为32个字节。需要:from aiohttp_session.cookie_storage import EncryptedCookieStorage- aiohttp_session.redis_storage.RedisStorage(redis_pool) -- 以redis形式存储JSON编码数据,只保留cookie中的redis密钥(随机UUID)。 redis_pool是一个aioredis池对象,由await aioredis.create_redis_pool(...)调用创建。需要:import aioredis
五、表单处理