[通过角色访问的python烧瓶动态菜单

问题描述 投票:0回答:1

我正在使用html和jinja2创建一个flask应用程序以呈现html页面。此应用将是两种权限的用户,[users,admin]

因此,当用户登录侧边栏菜单时,会限制对部分操作系统菜单文件的访问,而当管理员登录时,侧边栏是具有完全访问权限的另一方。

如何使用烧瓶?我没有想法去做:(

这是我的代码:

Flask APP;

from flask import Flask, render_template
from flask_bootstrap import Bootstrap

app = Flask(__name__, static_url_path='', static_folder='static')
Bootstrap(app)

 @app.route('/')
 def hellow():
 return "hellow"

 @app.route('/home')
 def home():

   return render_template('home.html')

 if __name__ == "__main__":
   app.run(debug=True)

布局html;


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="">
  <meta name="author" content="">
  <title>Simple Sidebar - Start Bootstrap Template</title>
  <link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  <link href="css/simple-sidebar.css" rel="stylesheet">
</head>
<body>
  <div class="d-flex" id="wrapper">
    <!-- Sidebar -->
    {{sidebar}}
    <!-- /#sidebar-wrapper -->
    <!-- Page Content -->
    <div id="page-content-wrapper">
      <nav class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
          <ul class="navbar-nav ml-auto mt-2 mt-lg-0">
          </ul>
        </div>
      </nav>
      <div class="container-fluid">
        {% block content %}
        {% endblock content %}
      </div>
    </div>
    <!-- /#page-content-wrapper -->
  </div>
  <!-- /#wrapper -->
  <!-- Bootstrap core JavaScript -->
  <script src="vendor/jquery/jquery.min.js"></script>
  <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
</body>
</html>

sidebar;

<div class="bg-light border-right" id="sidebar-wrapper">
    <div class="sidebar-heading">Start Bootstrap </div>
    <div class="list-group list-group-flush">
      <a href="#" class="list-group-item list-group-item-action bg-light">Dashboard</a>
      <a href="#" class="list-group-item list-group-item-action bg-light">Shortcuts</a>
      <a href="#" class="list-group-item list-group-item-action bg-light">Overview</a>
      <a href="#" class="list-group-item list-group-item-action bg-light">Events</a>
      <a href="#" class="list-group-item list-group-item-action bg-light">Profile</a>
      <a href="#" class="list-group-item list-group-item-action bg-light">Status</a>
    </div>
  </div>

home html

{% extends 'layout.html' %}
{% block content %}
works
{% endblock content %}
python flask
1个回答
0
投票

简短的答案是,您的问题需要的答案要长于此格式允许的范围。您将需要:

  1. 登录用户,对其进行身份验证,然后保存他们的会话。
  2. 将用户数据存储在数据库中,并为每个用户分配一个角色。
  3. 检查每个模板的呈现时间,并根据登录者及其角色来显示或隐藏html部分。

以前用实例对所有这些进行正确地解答是由比我更有才华的作家完成的。 Miguel Grinberg就是其中之一,他(免费)提供了他的Flask Mega-Tutorial

以下是该教程中的一些片段可能会有所帮助:

Flask登录简介

在本章中,我将向您介绍到非常流行的Flask扩展程序,称为Flask-Login。此扩展管理用户的登录状态,以便例如用户可以登录到应用程序,然后导航到其他页面应用程序“记住”用户已登录。

[...]

准备用于Flask登录的用户模型

烧瓶登录扩展名与应用程序的用户模型一起使用,并期望属性和要在其中实现的方法。这种方法很好,因为只要将这些必需项添加到模型中,Flask-Login没有任何其他要求,例如可以与基于任何数据库系统的用户模型一起使用。

下面列出了四个必需的项目:

is_authenticated:一个属性,如果用户具有有效的凭据,则为True,否则为False。

is_active:如果用户的帐户处于活动状态,则为True,否则为False。

is_anonymous:一个属性,对于常规用户为False,对于特殊的匿名用户为True。

get_id():一种方法,该方法以字符串的形式返回用户的唯一标识符(如果使用Python 2,则为unicode)。

完成这些步骤后,您将使用类似的方法隐藏或显示链接列表:

<div class="bg-light border-right" id="sidebar-wrapper">
    <div class="sidebar-heading">Start Bootstrap </div>
    <div class="list-group list-group-flush">
      <a href="#" class="list-group-item list-group-item-action bg-light">Dashboard</a>
      <a href="#" class="list-group-item list-group-item-action bg-light">Shortcuts</a>
      <a href="#" class="list-group-item list-group-item-action bg-light">Overview</a>
      {% if current_user.is_authenticated and current_user.role == 'Admin'%}
          <a href="#" class="list-group-item list-group-item-action bg-light">Events</a>
          <a href="#" class="list-group-item list-group-item-action bg-light">Profile</a>
          <a href="#" class="list-group-item list-group-item-action bg-light">Status</a>
      {% endif %}
    </div>
</div>
© www.soinside.com 2019 - 2024. All rights reserved.