如何避免Flask Web应用程序中的代码重复

时间:2018-02-17 08:43:12

标签: flask jinja2

我正在尝试更改基本html-template中的某个变量,其他html页面在个人帐户中输入用户后继承该变量。

这个想法如下:

  • 有基本html模板,取决于用户状态(登录或注销)是按钮RegistrationEnter / Exit

  • 如果用户已登录,则我希望Enter按钮和Registration按钮消失,而不是Enter按钮,我希望Exit按钮在那里

  • 如果用户未登录,则两个按钮应为:EnterRegistration

我设法使用flask,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 %}

2 个答案:

答案 0 :(得分:1)

我是这样做的:

def render_sidebar_template(tmpl_name, **kwargs):
    if current_user.is_authenticated:  # если залогинен
        trigger_logged_id()
    else:  # иначе
        trigger_logged_out()
    return render_template(tmpl_name,
                           login_button=g.login_button,
                           login_sidebar_class=g.login_sidebar_class,
                           login_button_class=g.login_button_class,
                           signin_button=g.signin_button,
                           signin_button_class=g.signin_button_class,
                           signin_sidebar_class=g.signin_sidebar_class,
                           personal_account=g.personal_account,
                           **kwargs)

而不是返回render_template(...)我调用上面的函数

@app.route('/')
def home():
    return render_sidebar_template("index.html")

答案 1 :(得分:0)

将您的逻辑直接放入基本模板中 - 从长远来看,它更容易理解意图和维护。逻辑将在扩展基页的每个页面上运行。

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

<body>
   <nav id="menu">
      <ul class="right">
        {% if current_user.is_authenicated %}
            <li class="login">Enter</li>
            <li class="signin">Registration</li>
        {% else %}
            <li class="logout">Exit</li>
        {% endif %}
    </ul>
</nav>
<main>

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

</body>