我正在尝试更改基本html-template中的某个变量,其他html页面在个人帐户中输入用户后继承该变量。
这个想法如下:
有基本html模板,取决于用户状态(登录或注销)是按钮Registration
和Enter
/ Exit
。
如果用户已登录,则我希望Enter
按钮和Registration
按钮消失,而不是Enter
按钮,我希望Exit
按钮在那里
如果用户未登录,则两个按钮应为:Enter
和Registration
我设法使用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 %}
答案 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>