如何在我的页面上嵌入Flask-Security登录表单?

Nic*_*ach 10 python jinja2 flask flask-security

使用Flask-Security提供的示例代码,我可以正常访问路径中的login_user.html表单,/login并且工作正常.但是,我想在左上角的所有网站页面上嵌入登录表单.我以为我可以使用Jinja {% include "security/login_user.html" %}语句来放置表单base.html,但这似乎不起作用.我收到以下错误:

jinja2.exceptions.UndefinedError: 'login_user_form' is undefined
Run Code Online (Sandbox Code Playgroud)

有没有办法在另一个模板中包含或嵌入登录表单,仍然可以访问相应的表单对象?

dav*_*ism 12

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>
Run Code Online (Sandbox Code Playgroud)

(这只是一个示例,您需要设置它以适合您的页面.)

你的看法都不会直接处理登录表单,所以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(),
    }
Run Code Online (Sandbox Code Playgroud)


say*_*yan 1

您的堆栈跟踪内容如下: 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()}}
...
Run Code Online (Sandbox Code Playgroud)

您必须将login_user_form其作为上下文变量传递给渲染模板。因此,在您的/login路线中,您应该返回如下内容:

return render_template("base.html",
        title = 'Home',
        form = login_user_form)
Run Code Online (Sandbox Code Playgroud)