覆盖 Flask-User/Flask-Login 的默认模板
Overriding Flask-User/Flask-Login's default templates
我找到了一个类似的问题,但答案似乎对我不起作用。
我使用 Flask User(我相信它扩展了 Flask Login)并且在大多数情况下它工作得很好。我已经构建了自己全新的登录和注册模板,而不是使用他们提供的模板。在 documentation 之后,我将这些模板放在 templates/flask_user/login.html
、templates/flask_user/register.html
等等。
我还在我的配置文件中设置了 USER_UNAUTHENTICATED_ENDPOINT = "login"
和 USER_UNAUTHORIZED_ENDPOINT = "login"
,其中 login
是我的登录路径的名称。
问题是,如果我已注销并尝试直接访问需要用户登录的页面,我将被转到 http://localhost:5000/user/sign-in
并显示 Flask-Login
登录页面。这有两点错误:1) 这不是正确的登录路径,2) 这不是正确的登录模板。
如果有人对此提出任何帮助,我将不胜感激。
编辑:
__init__.py
中初始化应用程序和 LoginManager 的代码:
app = Flask(__name__)
@app.context_processor
def inject_production_status():
return dict(production=True)
# Initialise flask_login
login = LoginManager(app)
login.login_view = 'login'
login.refresh_view = "login"
login.needs_refresh_message = "Please sign in again to access this page"
UserManager定义在models.py
的底部:
user_manager = UserManager(app, db, User)
UserManager
需要在 __init__.py
而不是 models.py
中初始化。 UserManager
将负责 LoginManager
.
的初始化
您需要在 __init__.py
中替换:
# Initialize flask_login
login = UserManager (app, db, User)
login.login_view = 'login'
login.refresh_view = "login"
login.needs_refresh_message = "Please sign in again to access this page"
来自
# Initialize flask_user
from .models.user_models import User
user_manager = UserManager (app, db, User)
...
# login is now accessible by user_manager.login_manager
(并将其从 models.py
中删除)
这是一个例子:
https://github.com/lingthio/Flask-User-starter-app/blob/master/app/init.py
与问题无关,但以防万一:从长远来看,您可以更轻松地查看 app.config.from_object
以更轻松地处理生产和开发配置。
我执行了@JBLaf 的建议,但这并没有解决问题。我意识到显示给我的默认登录页面实际上并不是 flask-login
的 login.html
模板,而是它的 login_auth0.html
模板。这是我没有在自己的 flask_user
文件夹中替换的模板,因为我认为没有必要。
两种解决方法:
- 设置
USER_ENABLE_AUTH0 = False
。这使得它使用 login.html
模板,这是我自己定制的模板。但是,这给我带来了问题,因为我确实允许 SSO 登录。所以更好的解决方案是:
- 在我的
templates/flask_user
文件夹中创建一个 login-auth0.html
文件,只包含行 {% include 'flask_user/login.html' %}
.
现在 Flask-User 将尝试重定向到 auth0 模板,该模板将呈现我的 login.html
模板。
我找到了一个类似的问题
我使用 Flask User(我相信它扩展了 Flask Login)并且在大多数情况下它工作得很好。我已经构建了自己全新的登录和注册模板,而不是使用他们提供的模板。在 documentation 之后,我将这些模板放在 templates/flask_user/login.html
、templates/flask_user/register.html
等等。
我还在我的配置文件中设置了 USER_UNAUTHENTICATED_ENDPOINT = "login"
和 USER_UNAUTHORIZED_ENDPOINT = "login"
,其中 login
是我的登录路径的名称。
问题是,如果我已注销并尝试直接访问需要用户登录的页面,我将被转到 http://localhost:5000/user/sign-in
并显示 Flask-Login
登录页面。这有两点错误:1) 这不是正确的登录路径,2) 这不是正确的登录模板。
如果有人对此提出任何帮助,我将不胜感激。
编辑:
__init__.py
中初始化应用程序和 LoginManager 的代码:
app = Flask(__name__)
@app.context_processor
def inject_production_status():
return dict(production=True)
# Initialise flask_login
login = LoginManager(app)
login.login_view = 'login'
login.refresh_view = "login"
login.needs_refresh_message = "Please sign in again to access this page"
UserManager定义在models.py
的底部:
user_manager = UserManager(app, db, User)
UserManager
需要在 __init__.py
而不是 models.py
中初始化。 UserManager
将负责 LoginManager
.
您需要在 __init__.py
中替换:
# Initialize flask_login
login = UserManager (app, db, User)
login.login_view = 'login'
login.refresh_view = "login"
login.needs_refresh_message = "Please sign in again to access this page"
来自
# Initialize flask_user
from .models.user_models import User
user_manager = UserManager (app, db, User)
...
# login is now accessible by user_manager.login_manager
(并将其从 models.py
中删除)
这是一个例子: https://github.com/lingthio/Flask-User-starter-app/blob/master/app/init.py
与问题无关,但以防万一:从长远来看,您可以更轻松地查看 app.config.from_object
以更轻松地处理生产和开发配置。
我执行了@JBLaf 的建议,但这并没有解决问题。我意识到显示给我的默认登录页面实际上并不是 flask-login
的 login.html
模板,而是它的 login_auth0.html
模板。这是我没有在自己的 flask_user
文件夹中替换的模板,因为我认为没有必要。
两种解决方法:
- 设置
USER_ENABLE_AUTH0 = False
。这使得它使用login.html
模板,这是我自己定制的模板。但是,这给我带来了问题,因为我确实允许 SSO 登录。所以更好的解决方案是: - 在我的
templates/flask_user
文件夹中创建一个login-auth0.html
文件,只包含行{% include 'flask_user/login.html' %}
.
现在 Flask-User 将尝试重定向到 auth0 模板,该模板将呈现我的 login.html
模板。