如何在我的页面上嵌入 Flask-Security 登录表单?
Posted
技术标签:
【中文标题】如何在我的页面上嵌入 Flask-Security 登录表单?【英文标题】:How do I embed a Flask-Security login form on my page? 【发布时间】:2018-04-29 06:53:10 【问题描述】:使用 Flask-Security 提供的示例代码,我可以从/login
路由正常访问login_user.html
表单,并且效果很好。但是,我想将登录表单嵌入到我网站左上角的所有页面中。我以为我可以使用 Jinja % include "security/login_user.html" %
语句将表单放入 base.html
,但这似乎不起作用。我收到以下错误:
jinja2.exceptions.UndefinedError: 'login_user_form' is undefined
有没有办法在另一个模板中包含或嵌入登录表单,并且仍然可以访问相应的表单对象?
【问题讨论】:
【参考方案1】:security/login_user.html
是登录表单的完整页面模板。这不是您希望在每个页面上嵌入的内容,因为它处理其他内容,例如闪现的消息、错误和布局。
编写您自己的模板以仅呈现表单并包含那个,或者将其添加到您的基本模板中。
<form action=" url_for_security('login') " method="POST">
login_user_form.hidden_tag()
login_user_form.email(placeholder='Email')
login_user_form.password(placeholder='Password')
login_user_form.remember.label login_user_form.remember
login_user_form.submit
</form>
(这只是一个示例,您需要对其进行样式设置以适合您的页面。)
您的任何视图都不会直接处理登录表单,因此在呈现大多数模板时login_form
和url_for_security
不可用(这导致了您观察到的原始问题)。使用app.context_processor
为每个请求注入它们。
from flask_security import LoginForm, url_for_security
@app.context_processor
def login_context():
return
'url_for_security': url_for_security,
'login_user_form': LoginForm(),
【讨论】:
【参考方案2】:您的堆栈跟踪显示:
jinja2.exceptions.UndefinedError: 'login_user_form' is undefined
此错误消息来自 Jinja,表示 login_user_form
未定义。
要解决这个问题,如果这是您的base.html
,
...
% block content %
<form action="" method="post" name="post">
form.hidden_tag()
...
您必须将login_user_form
作为上下文变量传递给您的渲染模板。因此,在您的 /login
路由中,您应该返回如下内容:
return render_template("base.html",
title = 'Home',
form = login_user_form)
【讨论】:
以上是关于如何在我的页面上嵌入 Flask-Security 登录表单?的主要内容,如果未能解决你的问题,请参考以下文章
即使我不在页面上,如何每天在特定时间在我的页面上运行 youtube 视频?