aiohttp--web框架、session、路由、cryptography

2019.7.23:

 

内容:aiohttp.web 、aiohttp_session、cryptography、其余没有涉及的到文档网站上查询


 

AIOHTTP--用于asyncio和Python的异步HTTP客户端/服务器

https://hubertroy.gitbooks.io/aiohttp-chinese-documentation/content/aiohttp%E6%96%87%E6%A1%A3/ServerUsage.html#%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%E7%AE%B1

可选的 cchardet作为chardet的更快替代品 

用于快速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

 


 

五、表单处理

 

 

posted @ 2019-07-23 14:21  Marvin_Tang  阅读(2309)  评论(0编辑  收藏  举报