Python aiohttp中間件示例

aiohttp

# 獲取表單
data = await self.request.post()

# 獲取url  /{user_id}/ 中的參數
user_id = self.request.match_info.get('user_id')

# 獲取Json
data = await self.request.json()

# 獲取get參數
name = self.request.query.get("name")

aiohttp 中間件

from aiohttp import web
from functools import wraps

@web.middleware
async def middleware1(request, handler):
    print('Middleware 1 called')
    response = await handler(request)
    print('Middleware 1 finished')
    return response

@web.middleware
async def middleware2(request, handler):
    print('Middleware 2 called')
    response = await handler(request)
    print('Middleware 2 finished')
    return response


async def logger_factory_003(app,handler):
    async def logger1_handler(request):

        print('i am logger factory 003')
        return await handler(request)
    return logger1_handler


def middleware_004(func):
    @wraps(func)
    async def inner(request, *args, **kwargs):
        print(">>>>>>>>>  004")
        resp =  await func(request, *args, **kwargs)
        print("<<<<<<<<<  004")
        return resp
    return inner


# 004是這有這個有用
@middleware_004
async def test(request):
    print('Handler function called')
    return web.Response(text="Hello")

# 這裏註冊的中間件是全局的
app = web.Application(middlewares=[middleware1, middleware2,logger_factory_003])
app.router.add_get('/', test)
web.run_app(app,host="0.0.0.0",port="8888")
Middleware 1 called
Middleware 2 called
i am logger factory 003
>>>>>>>>>  004
Handler function called
<<<<<<<<<  004
Middleware 2 finished
Middleware 1 finished

如果是類View, 全局註冊的中間件不需要更改,只有004號直接作用到view上的需要改.

如我下面摘錄的代碼

import jwt
from aiohttp import web
from functools import wraps
from settings import JWT_SECRET_KEY
from dao.utils import json_dumps

def jwt_token_required(func):
    """This function applies only to class views."""
    # jwt.exceptions.DecodeError token 格式不對
    # jwt.exceptions.InvalidSignatureError 祕鑰key不對
    # jwt.exceptions.InvalidAlgorithmErro 算法不一致
    # jwt.exceptions.ExpiredSignatureError token過期

    @wraps(func)
    async def inner(cls, *args, **kwargs):
        jwt_token = cls.request.query.get('token')
        if not jwt_token:
            data = {"code": 10005, "msg": "缺少token"}
            return web.json_response(data=data, dumps=json_dumps)
        try:
            jwt_payload = jwt.decode(jwt_token, JWT_SECRET_KEY, algorithms=['HS256'])
            cls.request.app["jwt_token"] = jwt_payload
            return await func(cls, *args, **kwargs)  # 正常調用並返回
        except (
            jwt.exceptions.DecodeError,
            jwt.exceptions.InvalidSignatureError,
            jwt.exceptions.InvalidAlgorithmError
            ) as e:

            data = {"code": 10006, "msg": "token不正確"}
            return web.json_response(data=data, dumps=json_dumps)
        except jwt.exceptions.ExpiredSignatureError as e:
            data = {"code": 10007, "msg": "token已過期"}
            return web.json_response(data=data, dumps=json_dumps)

    return inner
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章