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

2019.7.23:html

 

內容:aiohttp.web 、aiohttp_session、cryptography、其他沒有涉及的到文檔網站上查詢python


 

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%B1git

可選的 cchardet做爲chardet的更快替代品 github

用於快速DNS解析的可選 aiodnsweb

支持非阻塞異步I/O的庫redis

 

如下是服務器端的配置:算法

 

1、配置請求處理器和路由:

 

 

   

 

 

 


 

2、靜態文件的處理 

 

 

3、返回JSON相應

 

 


 

4、處理用戶會話

  aiohttp.web沒有內置會話,不過你能夠使用第三方庫aiohttp_session來提供會話支持安全

 https://github.com/aio-libs/aiohttp-session服務器

 

該庫容許咱們將用戶特定的數據存儲到會話對象中。cookie

會話對象具備相似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

主流填充標準:PKCS七、ISO 1012六、ANSI X.92三、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

 


 

5、表單處理

 

相關文章
相關標籤/搜索