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
五、表單處理