Flask 和 Auth0 - 如何检查用户是否在 Jinja 中通过身份验证
Flask and Auth0 - How to check if user is authenticated in Jinja
我在我的 Flask 应用程序中使用 Auth0 进行身份验证,想知道如何检查用户是否在 Jinja 模板中进行了身份验证。
我想知道是否有一种方法可以做一些类似于 LoginManager 的事情:
{% if current_user.is_anonymous %} #<-- This here
<li><a href="{{ url_for('login') }}">Login</a></li>
{% else %}
<li><a href="{{ url_for('user', username=current_user.username) }}">Profile</a></li>
<li><a href="{{ url_for('logout') }}">Logout</a></li>
{% endif %}
你有两个选择:
- 使用全局
g
对象 在模板中自动可用 和 before_app_request
挂钩,阅读官方 Flask
tutorial:
@bp.before_app_request
def load_logged_in_user():
"""If a user id is stored in the session, load the user object from
the database into ``g.user``."""
user_id = session.get("user_id")
if user_id is None:
g.user = None
else:
g.user = (
get_db().execute("SELECT * FROM user WHERE id = ?", (user_id,)).fetchone()
)
然后在您的模板中:
{% if g.user %}
<li><span>{{ g.user['username'] }}</span>
<li><a href="{{ url_for('auth.logout') }}">Log Out</a>
{% else %}
<li><a href="{{ url_for('auth.register') }}">Register</a>
<li><a href="{{ url_for('auth.login') }}">Log In</a>
{% endif %}
- 将你的
current_user
对象注入到 context processor,flask-login
是你的好灵感(没有装饰器):
[..]
def _get_user():
if has_request_context() and not hasattr(_request_ctx_stack.top, 'user'):
current_app.login_manager._load_user()
return getattr(_request_ctx_stack.top, 'user', None)
[..]
def _user_context_processor():
return dict(current_user=_get_user())
然后获取当前应用程序(在您的情况下可能需要导入 current_app
对象)
[..]
app.context_processor(_user_context_processor)
然后你可以使用 current_user
比如 :
{% if current_user.is_anonymous %} #<-- This here
<li><a href="{{ url_for('login') }}">Login</a></li>
{% else %}
<li><a href="{{ url_for('user', username=current_user.username) }}">Profile</a></li>
<li><a href="{{ url_for('logout') }}">Logout</a></li>
{% endif %}
我在我的 Flask 应用程序中使用 Auth0 进行身份验证,想知道如何检查用户是否在 Jinja 模板中进行了身份验证。
我想知道是否有一种方法可以做一些类似于 LoginManager 的事情:
{% if current_user.is_anonymous %} #<-- This here
<li><a href="{{ url_for('login') }}">Login</a></li>
{% else %}
<li><a href="{{ url_for('user', username=current_user.username) }}">Profile</a></li>
<li><a href="{{ url_for('logout') }}">Logout</a></li>
{% endif %}
你有两个选择:
- 使用全局
g
对象 在模板中自动可用 和before_app_request
挂钩,阅读官方Flask
tutorial:
@bp.before_app_request
def load_logged_in_user():
"""If a user id is stored in the session, load the user object from
the database into ``g.user``."""
user_id = session.get("user_id")
if user_id is None:
g.user = None
else:
g.user = (
get_db().execute("SELECT * FROM user WHERE id = ?", (user_id,)).fetchone()
)
然后在您的模板中:
{% if g.user %}
<li><span>{{ g.user['username'] }}</span>
<li><a href="{{ url_for('auth.logout') }}">Log Out</a>
{% else %}
<li><a href="{{ url_for('auth.register') }}">Register</a>
<li><a href="{{ url_for('auth.login') }}">Log In</a>
{% endif %}
- 将你的
current_user
对象注入到 context processor,flask-login
是你的好灵感(没有装饰器):
[..]
def _get_user():
if has_request_context() and not hasattr(_request_ctx_stack.top, 'user'):
current_app.login_manager._load_user()
return getattr(_request_ctx_stack.top, 'user', None)
[..]
def _user_context_processor():
return dict(current_user=_get_user())
然后获取当前应用程序(在您的情况下可能需要导入 current_app
对象)
[..]
app.context_processor(_user_context_processor)
然后你可以使用 current_user
比如 :
{% if current_user.is_anonymous %} #<-- This here
<li><a href="{{ url_for('login') }}">Login</a></li>
{% else %}
<li><a href="{{ url_for('user', username=current_user.username) }}">Profile</a></li>
<li><a href="{{ url_for('logout') }}">Logout</a></li>
{% endif %}