• 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

    五、表单处理

     

  • 相关阅读:
    2016-09-13面试记录
    javascript中的深度拷贝的实现过程及深拷贝的几种方法。
    javascript中的for in循环
    常见的兼容问题及其解决方法。
    一次清空所有数据方法
    数组排序
    css对齐 挖坑~
    css reset样式重置
    CSS 表单
    CSS 表格
  • 原文地址:https://www.cnblogs.com/marvintang1001/p/11231500.html
Copyright © 2020-2023  润新知