django 通过用户的权限控制用户的菜单

28 篇文章 1 订阅
6 篇文章 0 订阅

菜单接口

from django.contrib import auth
from django.contrib.auth.decorators import login_required,permission_required
from django.shortcuts import render,HttpResponse,HttpResponseRedirect,redirect,reverse
from django.http import HttpRequest,JsonResponse,HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.models import User, Permission

@login_required(login_url="/login")
@csrf_exempt
def menu(request):
    data=[{'text': '系统功能','iconCls': 'icon-more','state': 'open','children': [
            {'text': '系统管理','url':'/admin'}]
           },
            {'text': '功能','iconCls': 'icon-more','state': 'open','children': [
                {'text': '首页', 'url':'/about'},
                {'text': '数据管理', 'url': '/datalist'},
            ]}
       ]
    permissions = Permission.objects.filter(user=request.user)
    codenames=[]
    for per in permissions:
        per:Permission
        codenames.append(per.codename)
    lib.expel_permission(data, codenames)
    # Permissions that the user has via a group
    # group_permissions = Permission.objects.filter(group__user=request.user)
    response=JsonResponse(data=data,safe=False)
    return response

视图接口

@login_required(login_url="/login")
@permission_required("views.about",login_url="/login/") #此处定义了这个接口对应的权限
def about(request):
    return render(request,"about.html")

Lib库函数

def expel_permission(menu:list,codenames):
    for m in menu:
        if 'url' in m.keys() and m["url"] not in [f"/{codename}" for codename in codenames]:
            menu.remove(m)
        if 'children' in m.keys() and m["children"]:
            expel_permission(m["children"],codenames)

配置接口权限类型,表django_content_type

配置权限内容,表auth_permission

配置用户权限

再次请求接口/menu,会发现当前用户的菜单根据权限自动更新了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值