Как вставить форму входа в флеш-память на моей странице?

Используя пример кода, предоставленный Flask-Security, я могу получить доступ к форме login_user.html из маршрута /login, и это нормально. Тем не менее, я хотел бы вставить форму входа на все страницы моего сайта в левом верхнем углу. Я думал, что могу использовать инструкцию 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 есть undefined.

Чтобы решить эту проблему, если это был ваш 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)