如何在我的页面上嵌入 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_formurl_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 视频?

如何在我的网站上执行以下操作? [关闭]

如何在 html 中嵌入 .AVI?

实现 Python Flask-Security 时如何获取当前用户?

嵌入式谷歌地图上的双指缩放缩放整个页面

如何在我的网站上嵌入 Flash 对象?