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

 


 

五、表單處理

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM