Веб-приложения фляжку, с обработкой на статусе пользователя


Я пытаюсь изменить какую-то переменную в базу HTML-шаблонов, которые другие HTML-страницы наследовать от После ввода пользователем в личном кабинете.

Идея заключается в следующем:

  • существует базовый HTML шаблон, а там зависит от статуса пользователя (вход в систему или выход из системы) кнопки Registration и Enter/Exit.

  • если пользователь вошел в систему, то я хочу Enter кнопки и Registration кнопка исчезла и вместо Enter кнопку Я хочу Exit кнопку, чтобы быть там

  • в случае если пользователь не вошел в систему, то две кнопки должны быть: Enter и Registration

Мне удалось выполнить эту задачу, используя колбу, jinja2 и Python, но мой бэкэнд код выглядит невыносимо некрасиво, потому что слишком много дублирования

Вот мой код на Python:

эта функция выполняется, прежде чем пользователь попадает на любую HTML-страницу и определяет ее статус

from flask import g
from flask import render_template
@app.url_value_preprocessor
def send_user_login_status(endpoint, values):
    if current_user.is_authenticated: # if logged in
        g.login_button_class = u'logout'
        g.login_button = u'Exit'         

        g.signin_button = u''
        g.signin_button_class = u'signout'
    else: # if not logged in
        g.login_button_class = u'login'
        g.login_button = u'Enter'


        g.signin_button = u'Registration'
        g.signin_button_class = u'signin'

    return render_template("base.html",
                           login_button=g.login_button,                               
                           login_button_class=g.login_button_class,
                           signin_button=g.signin_button,
                           signin_button_class=g.signin_button_class,
                           )

И теперь я должен каждый раз передавать переменные в HTML-страницу в порядок эту страницу, чтобы быть с необходимой кнопки.

Например, главная страница:

@app.route('/')
def home():
    return render_template("index.html",
                           login_button=g.login_button,                                                           
                           login_button_class=g.login_button_class,
                           signin_button=g.signin_button,
                           signin_button_class=g.signin_button_class,                           
                           )

или о нас страницы:

@app.route('/about')
def about():
    # send_user_login_status()
    return render_template("about.html",
                           login_button=g.login_button,                            
                           login_button_class=g.login_button_class,
                           signin_button=g.signin_button,
                           signin_button_class=g.signin_button_class,
                         )

Это моя функция Python выхода:

@app.route('/logout', methods=['POST'])
def logout():
    login_status = logout_user()
    if login_status:
        g.login_button_class = u'login'
        g.login_button = u'Enter'


        g.signin_button = u'Registration'
        g.signin_button_class = u'signin'


        jsonify({'result': True})
        return redirect('/')

И как вы видите существует слишком много дублирования, потому что мне нужно пройти этот зависит-на вход-состояние переменных для каждой HTML-странице.

В то время как HTML-код выглядит красиво:

base.html

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8"/>
</head>

<body>
         <nav id="menu">
          <ul class="right">
                    <li class="{{ login_button_class }}"> {{ login_button }}</li>
                    <li class="{{ signin_button_class }}">{{ signin_button }}</li>
                </ul>
         </nav>
         <main>

                {% block content %}
                {% endblock %}
         </main>

</body>

index.html

{% extends "base.html" %}
{% block content %}
 <h1>Home</h1>
{% endblock %}

about.html

{% extends "base.html" %}
{% block content %}
 <h1>About</h1>
{% endblock %}


281
4
задан 17 февраля 2018 в 08:02 Источник Поделиться
Комментарии
1 ответ

Несмотря на HTML код действительно выглядит красиво, там, где вы хотите, чтобы отметить ваши усилия

Джимма поставляет условные блоки (как в Python), где вы можете указать, какие кнопки вы хотите, чтобы появиться на экране, в зависимости от того, если пользователь вошел в систему или нет

Это голый пример

<div>
{%+ if something %}yay{% endif %}
</div>

Следуя вашему примеру, ваше состояние для проверки подлинности пользователь может перейти в шаблоне напрямую

{% if current_user.is_authenticated %}
Hi {{ current_user.name }}!
{% endif %}

Не стесняйтесь узнать больше о варианты шаблонов по следующей ссылке на Джимма документации

http://jinja.pocoo.org/docs/2.10/templates/

Наслаждайтесь кодирования :)

1
ответ дан 17 февраля 2018 в 07:02 Источник Поделиться