1.概述
接收传递的参数方式很多,例如request,form形式,这两种在之前的内容中都使用过,我们这次将采用把参数放在路由地址中传递的方式进行实现接口。
后端需要接收两个参数,第一个是哪个角色:rid,第二个是哪个菜单(权限):mid;
本次接口的功能是:删除某一个角色(role)的某一个权限(menu)
2.主要代码
# 使用路由地址进行参数的传递
# 删除角色的权限
@role.route('/del_menu/<int:rid>/<int:mid>')
def del_menu(rid,mid):
try:
r = models.Role.query.get(rid)
m = models.Menu.query.get(mid)
# 注意:当我们获取这个mid时候,其实是从Menu中获取到的,只要存在这个权限一定能获取到
# 但是,可能角色中并不存在这个权限,只是Menu中有
if all([r,m]):
# 查看m是否真的存在于r的权限中,存在才能删
if m in r.menus:
# 从角色中移除其中的权限
r.menus.remove(m)
# 当我们删除一级菜单(权限)时候,如果存在子目录,一共连带一起删除
if m.level ==1:
for temp_m in m.children: # 获取删除当前根节点的所有子节点
if temp_m in r.menus: # 判断当前子节点是在当前权限
r.menus.remove(temp_m)
db.session.commit()
return to_dict_msg(200,msg='删除权限成功!!!')
return to_dict_msg(10021)
return to_dict_msg(10000)
except Exception as e:
print(e)
return to_dict_msg(20000)
3.测试结果
第一次删除
第二次删除
删除主节点,连带删除子节点
4.完整代码展示
# flask_shop/role/view.py
from ast import Delete
from flask import request
from flask_shop.role import role,role_api
from flask_shop import models,db
from flask_restful import Resource
from flask_shop.utils.message import to_dict_msg
class Role(Resource):
# 获取数据
def get(self):
role_list = []
try:
roles = models.Role.query.all()
role_list = [r.to_dict() for r in roles]
return to_dict_msg(200, role_list, '获取角色列表成功')
except Exception as e:
print(e)
return to_dict_msg(20000)
# 增加数据
def post(self):
name = request.form.get('name')
desc = request.form.get('desc')
try:
if name:
role = models.Role(name= name, desc= desc)
db.session.add(role)
db.session.commit()
return to_dict_msg(200, msg='增加角色成功!!!!')
except Exception as e:
print(e)
return to_dict_msg(20000)
# 删除数据
def delete(self):
try:
id = int(request.form.get('id'))
r = models.Role.query.get(id)
if r:
db.session.delete(r)
db.session.commit()
return to_dict_msg(200,msg="删除角色成功!!!!!")
except Exception:
return to_dict_msg(20000)
# 修改数据
def put(self):
try:
id = int(request.form.get('id'))
name = request.form.get('name').strip() if request.form.get('name') else ''
desc = request.form.get('desc').strip() if request.form.get('desc') else ''
if name:
r = models.Role.query.get(id)
if r:
r.name = name
r.desc = desc
db.session.commit()
return to_dict_msg(200, msg= '修改角色信息成功!!!')
return to_dict_msg(10020)
except Exception as e:
return to_dict_msg(20000)
role_api.add_resource(Role, '/role')
# 使用路由地址进行参数的传递
# 删除角色的权限
@role.route('/del_menu/<int:rid>/<int:mid>')
def del_menu(rid,mid):
try:
r = models.Role.query.get(rid)
m = models.Menu.query.get(mid)
# 注意:当我们获取这个mid时候,其实是从Menu中获取到的,只要存在这个权限一定能获取到
# 但是,可能角色中并不存在这个权限,只是Menu中有
if all([r,m]):
# 查看m是否真的存在于r的权限中,存在才能删
if m in r.menus:
# 从角色中移除其中的权限
r.menus.remove(m)
# 当我们删除一级菜单(权限)时候,如果存在子目录,一共连带一起删除
if m.level ==1:
for temp_m in m.children: # 获取删除当前根节点的所有子节点
if temp_m in r.menus: # 判断当前子节点是在当前权限
r.menus.remove(temp_m)
db.session.commit()
return to_dict_msg(200,msg='删除权限成功!!!')
return to_dict_msg(10021)
return to_dict_msg(10000)
except Exception as e:
print(e)
return to_dict_msg(20000)