我有一个装饰器,它将一个用户添加到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)
你可以在一个类上注释一个属性,即使这个类不是你的,只需在它后面加上一个冒号。例如,你可以在一个类上注释一个属性,即使这个类不是你的,只需在它后面加上一个冒号。
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()
就是这样
你可以代理 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()