登录django admin后台进行
添加数据
添加表关系
url
/user/list/
/user/add/
/user/update/(\d+)/
/user/delete/(\d+)/
/menu/list/ /menu/add/ /menu/update/(\d+)/ /menu/delete/(\d+)/ /position/list/ /position/add/ /position/update/(\d+)/ /position/delete/(\d+)/ /auth/list/ /auth/add/ /auth/update/(\d+)/ /auth/delete/(\d+)/ /authgroup/list/ /authgroup/add/ /authgroup/update/(\d+)/ /authgroup/delete/(\d+)/ /host/list/ /host/add/ /host/update/(\d+)/ /host/delete/(\d+)/
登录后数据需求分析
通过ORM 取得其数据
列如:
老板 /auth/list/ 查询权限 权限表 权限
老板 /auth/add/ 添加权限 权限表 权限
老板 /auth/update/(\d+)/ 编辑权限 权限表 权限
老板 /auth/delete/(\d+)/ 删除权限 权限表 权限
老板 /host/list/ 查询主机 主机 主机
老板 /host/add/ 添加主机 主机 主机
老板 /host/update/(\d+)/ 编辑主机 主机 主机
老板 /host/delete/(\d+)/ 删除主机 主机 主机
数据的应用场景:
url :
1 . --> 菜单的跳转地址 : /host/list/
2 . --> 验证用户有没有改地址的访问权限 -> 按钮 -> 删除、编辑
{权限:
为了解决 跳转页面时,也保留菜单栏的数据,
可以再auth表里添加一个 foreignkey 关联自己的方式自锁
to_display = models.ForeignKey(to='Auth', blank=True, null=True, verbose_name='显示', related_name='authauth')
{ 'pos__auth__group__ti__title': [
判断登录用户的权限
权限
职位表(组)
权限代码演示
登录后要做的两件事:
- 把菜单相关的数据拿到
- 把用户所有能访问的url拿到
views.py
host_obj = models.UserInfo.objects.filter(name=username, passwd=password)
if host_obj.first():
obj_all = host_obj.values('name',
输出结果:
菜单
{
'主机': {
'title': '主机',
'lower': [{
'url': '/user/list/', 'name': '查询用户', 'display_url': None, 'display_name': None }, { 'url': '/host/list/', 'name': '查询主机', 'display_url': None, 'display_name': None }] }, '权限': { 'title': '权限', 'lower': [{ 'url': '/menu/list/', 'name': '查询菜单', 'display_url': None, 'display_name': None }, { 'url': '/position/list/', 'name': '查询职位', 'display_url': None, 'display_name': None }, { 'url': '/authgroup/list/', 'name': '查询权限组', 'display_url': None, 'display_name': None }, { 'url': '/auth/list/', 'name': '查询权限', 'display_url': None, 'display_name': None }] } } 所有权限 ---> django 中间件,判断登录用户的权限,来显示内容 { '用户表': { 'url': ['/user/list/', '/user/add/', '/user/update/(\\d+)/', '/user/delete/(\\d+)/'] }, '菜单表': { 'url': ['/menu/list/', '/menu/add/', '/menu/update/(\\d+)/', '/menu/delete/(\\d+)/'] }, '职位表': { 'url': ['/position/list/', '/position/add/', '/position/update/(\\d+)/', '/position/delete/(\\d+)/'] }, '权限组表': { 'url': ['/authgroup/list/', '/authgroup/add/', '/authgroup/update/(\\d+)/', '/authgroup/delete/(\\d+)/'] }, '权限表': { 'url': ['/auth/list/', '/auth/add/', '/auth/update/(\\d+)/', '/auth/delete/(\\d+)/'] }, '主机': { 'url': ['/host/list/', '/host/add/', '/host/update/(\\d+)/', '/host/delete/(\\d+)/'] } }
菜单层级
一级菜单1 -->(1,'')
第二级菜单(2, 1)
第三级菜单 (3, 2)
一级菜单2 -->(1,'')
第二级菜单(2, 1)
第三级菜单 (3, 2)
可以封装为一个函数
通过传值即可调用函数
可以将结果存入
- 内存
- 数据库
- NoSQL
- session
这里放在session 里方便
views.py 视图
from hc_auth import auth_data
封装函数体
auth_data.py
def menu_auth(host_obj,request):
obj_all = host_obj.values('name',
templates
auth_index.html
<div id='auth_index'>
{% for i in menu_dict.values %}
<h2>{{i.title}}</h2> {% for ii in i.lower %} <div> <a href="{{ii.url}}">{{ii.name}}</a> </div> {% endfor %} {% endfor %} </div>
代码整理及总结
中间件判断
middleware
import re
VALID_LIST = ['/authority/demo/',]
str. format 字符串拼接技巧
http://www.runoob.com/python/att-string-format.html
template 模板的继承
{% extends 'auth_index.html' %}
# 继承它需要在 /host/list/ 页面的视图里添加数据
# menu_dict = request.session.get('menu_dict')
{% block content %}
{% if '/host/add/' in pos_list %}
<div>
<a href="/host/add/"> 添加主机 </a> </div> {% endif %} <table class="table table-bordered table-hover" id="table"> <h3> 当前主机的详细信息! </h3> <thead > <tr> <th> </th> <th> 主机名 </th> <th> 实例名 </th> <th> CPU </th> <th> 内存/G </th> <th> 带宽/M </th> <th> 登录端口 </th> <th> 公网IP </th> <th> 主机状态 </th> <th> 内核版本 </th> <th> 操作系统 </th> <th> 来源IP </th> <th> 标签 </th> <th>地区</th> {% if '/host/update/(\\d+)/' in pos_list %} <th>编辑</th> {% endif %} {% if '/host/delete/(\\d+)/' in pos_list %} <th>删除</th> {% endif %} </tr> </thead> <tbody> {% for host in hosts_page %} <tr> <td>{{ host.id }}</td> <td>{{ host }}</td> <td> {{ host.ecsname }} </td> <td> {{ host.cpu }} </td> <td> {{ host.mem }} </td> <td> {{ host.speed }} </td> <td> {{ host.login_port }} </td> <td> {{ host.eth1_network }} </td> <td> {{ host.get_state_display }} </td> <td> {{ host.kernel }} </td> <td> {{ host.os }} </td> <td> {{ host.source }} </td> <td> {{ host.lab }} </td> <td>{{ host.region }}</td> {% if '/host/update/(\\d+)/' in pos_list %} <td><a href="/host/edit/{{ host.id }}"> 编辑 </a></td> # (\d+) 因为我url里写了匹配数字,所以这里直接可以写成"/host/edit/{{ host.id }}" {% endif %} {% if '/host/delete/(\\d+)/' in pos_list %} <td><a href="/host/del?id={{ host.id }}"> 删除 </a></td> {% endif %} </tr> {% endfor %} </tbody> </table >