如何将python类型注释添加到flask全局上下文g中?

问题描述 投票:2回答:1

我有一个装饰器,它将一个用户添加到flask全局上下文g中。

class User:
    def __init__(self, user_data) -> None:
        self.username: str = user_data["username"]
        self.email: str = user_data["email"]

def login_required(f):
    @wraps(f)
    def wrap(*args, **kwargs):
        user_data = get_user_data()
        user = User(user_data)
        g.user = User(user_data)

        return f(*args, **kwargs)

    return wrap

我希望当我在控制器中访问g.user时,g.user的类型(User)能够被知道。我怎样才能实现这个目标?(我使用的是pyright)

python flask mypy python-typing pyright
1个回答
0
投票

你可以在一个类上注释一个属性,即使这个类不是你的,只需在它后面加上一个冒号。例如,你可以在一个类上注释一个属性,即使这个类不是你的,只需在它后面加上一个冒号。

g.user: User

就是这样 That's it. 因为它大概在任何地方都有效,所以我会把它放在你代码的顶部。

from functools import wraps

from flask import Flask, g

app = Flask(__name__)


class User:
    def __init__(self, user_data) -> None:
        self.username: str = user_data["username"]
        self.email: str = user_data["email"]


# Annotate the g.user attribute
g.user: User


def login_required(f):
    @wraps(f)
    def wrap(*args, **kwargs):
        g.user = User({'username': 'wile-e-coyote',
                       'email': 'coyote@localhost'})

        return f(*args, **kwargs)

    return wrap


@app.route('/')
@login_required
def hello_world():
    return f'Hello, {g.user.email}'


if __name__ == '__main__':
    app.run()

就是这样


0
投票

你可以代理 g 对象。考虑以下实施方式。

import flask


class User:
    ...


class _g:

    user: User
    # Add type hints for other attributes
    # ...

    def __getattr__(self, key):
        return getattr(flask.g, key)


g = _g()

© www.soinside.com 2019 - 2024. All rights reserved.