首页 > 编程问答 >如何在flask和jinjia2模板中仅显示一个登录或注销按钮?

如何在flask和jinjia2模板中仅显示一个登录或注销按钮?

时间:2024-07-28 12:47:31浏览次数:14  
标签:python html flask jinja2

我想在用户登录时显示注销按钮,在用户注销时显示登录按钮。但是这些按钮显示的次数与我有用户的次数一样多。我该如何修复它?

--html code 
          {% for user in users %}
            {% if user.user_id == session['user_id'] %}
            <li class="nav-item">
              <a class="nav-link js-scroll-trigger" href="/logout">Logout &nbsp;</a>
            </li>
            {% elif user.user_id != session['user_id'] %}
            <li class="nav-item">
              <a class="nav-link js-scroll-trigger" href="/login_register">Login &nbsp;</a>
            </li> 
            {% endif %}
          {% endfor %}

--server.py code
          @app.route('/')
          def landing():

          mysql = connectToMySQL('comfort_zone')
          query = "Select user_id from users"
          users = mysql.query_db(query)
          return render_template('index.html',users=users)


遇到的问题是,在 users 列表中的 每个用户 上循环,而不是只检查一次当前用户是否已登录。

以下是在 Flask 和 Jinja2 模板中仅显示一个登录或注销按钮的方法:

1. 简化路由函数:

from flask import session

@app.route('/')
def landing():
    return render_template('index.html')

不需要从数据库中获取所有用户,只需要知道当前是否有用户登录即可。Flask 的 session 对象可以帮助做到这一点。

2. 更新 Jinja2 模板:

{% if 'user_id' in session %}
  <li class="nav-item">
    <a class="nav-link js-scroll-trigger" href="/logout">Logout &nbsp;</a>
  </li>
{% else %}
  <li class="nav-item">
    <a class="nav-link js-scroll-trigger" href="/login_register">Login &nbsp;</a>
  </li> 
{% endif %}

这里我们直接在模板中检查 session 中是否存在 user_id 。如果存在,则说明用户已登录,显示“注销”按钮;否则显示“登录”按钮。

解释:

  • 'user_id' in session : 这行代码检查当前 session 中是否存在名为 user_id 的键。如果用户已登录,通常会在登录过程中将 user_id 存储在 session 中。
  • {% if ... %}{% else %}{% endif %} : 这是 Jinja2 的条件语句,用于根据条件显示不同的内容。

其他建议:

  • 登录逻辑: 确保的登录路由 ( /login_register ) 在成功登录后将 user_id 存储到 session 中: session['user_id'] = user.id
  • 注销逻辑: 确保的注销路由 ( /logout ) 清除 session 中的 user_id session.pop('user_id', None)

通过以上修改,将能够在 Flask 和 Jinja2 模板中正确地显示登录或注销按钮,而不会出现重复显示的问题。

标签:python,html,flask,jinja2
From: 60477757

相关文章

  • AttributeError:'int'对象没有属性'index'(python)
    我正在Python上进行“猜单词”,但我无法弄清楚这个错误。AttributeError:'int'objecthasnoattribute'index'(python)它在线上给了我一个错误letterIndex=word.index(guess)defcheckLetter(word):blanks='_'*len(str(word))print('W......
  • 尝试在Python中使用for循环来输出大于或等于序列中的数字
    这是我的Python代码:largest_so_far=-1print('before',largest_so_far)forthe_numin[9,41,12,3,74,15]:ifthe_num>largest_so_far:largest_so_far=the_numprint(largest_so_far,'isbiggerthan',the_num)......
  • 如何在 wxPython 的 for 循环中添加文本输入框?
    我是wxPython的新手,正在开发一个带有GUI的基本程序,让用户标记图像。现在,当用户单击“导入”按钮时,他们可以选择一个目录。然后,代码使用matplotlib在for循环中显示该目录中的每个图像。但是,我不知道如何在for循环中访问用户输入。这就是该函数现在的样子:importmatplo......
  • 【Python】字母 Rangoli 图案
    一、题目YouaregivenanintegerN.YourtaskistoprintanalphabetrangoliofsizeN.(RangoliisaformofIndianfolkartbasedoncreationofpatterns.)Differentsizesofalphabetrangoliareshownbelow:#size3----c------c-b-c--c-b-a-b-c--c......
  • python 闭包、装饰器
    一、闭包:1.外部函数嵌套内部函数 2.外部函数返回内部函数 3.内部函数可以访问外部函数局部变量         闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行完毕,这种现象称为闭包。在Python中,闭包常常用......
  • 掌握 IPython %%time 魔法命令:高效测量代码块执行时间
    引言在编程和数据分析中,了解代码的执行时间是优化性能的关键步骤。IPython,作为一个强大的交互式计算环境,提供了多种工具来帮助用户测量和优化代码。其中,%%time魔法命令是IPython中用来测量代码块执行时间的便捷工具。本文将详细介绍%%time魔法命令的使用方法,并通过一......
  • 探索 IPython 中的 %%javascript 魔法命令:运行 JavaScript 代码的秘籍
    引言IPython是一个强大的交互式计算环境,它不仅支持Python语言,还通过各种魔法命令扩展了其功能。其中,%%javascript魔法命令是IPython扩展中一个非常有趣的特性,它允许用户在IPython环境中直接运行JavaScript代码。这对于需要在数据科学和科学计算中使用JavaScript......
  • pythonasm库分析,看看你和自学编程小学生的差距
    下面是pythonasm.asm库的源代码fromkeystoneimport*fromcapstoneimport*assembly_instructions=[]#储存汇编指令的列表#汇编指令写入列表defmov(reg1,reg2):assembly_instructions.append(f"mov{reg1},{reg2}")defdb(value):assembly_instructio......
  • 【Python系列】Python 中的垃圾收集:深入理解与实践
    ......
  • Python酷库之旅-第三方库Pandas(050)
    目录一、用法精讲181、pandas.Series.var方法181-1、语法181-2、参数181-3、功能181-4、返回值181-5、说明181-6、用法181-6-1、数据准备181-6-2、代码示例181-6-3、结果输出182、pandas.Series.kurtosis方法182-1、语法182-2、参数182-3、功能182-4、返回值1......