zoukankan      html  css  js  c++  java
  • 如何用Django建立一个后台CRM系统06

    权限限制(重定向)

      在我的理解中 权限限制差不多是在搞复杂一点的重定向问题

        上部分F代码不够优雅好看 重新写一个py函数 

        即已经登录过的用户不会跳转到login/register页面的限制

        装饰器decorators 的意思差不多是把一个函数当作另外一个函数的参数

          -创建一个decorators。py装饰器函数 

    from django.shortcuts import redirect
    from django.http import HttpResponse
    
    def unanthenticated_user(view_func):
        def wrapper_func(request, *args, **kwargs):
            if request.user.is_authenticated:
                return redirect('home')
            else:
                return view_func(request, *args, **kwargs)
        return wrapper_func

          -在loginPage/registerPage上面@出来 

           把这两个函数当中参数传入views_function

    @unanthenticated_user
    def registerPage(request):
        form = CreatUserForm()
        if request.method=='POST':
            form = CreatUserForm(request.POST)
            if form.is_valid():
                form.save()
                user = form.cleaned_data.get('username')
                messages.success(request,'Accounts was created for '+ user)
                return redirect('login')
        context = {'form': form}
        return render(request,'accounts/register.html',context)
    
    @unanthenticated_user
    def loginPage(request):
        if request.method =='POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            user = authenticate(request, username=username,password=password)
            if user is not None:
                login(request, user)
                return redirect('home')
            else:
                messages.info(request,'Account or Password is incorrect')
        return render(request, 'accounts/login.html')

        对管理员和顾客身份的权限限制

        即管理员开发全部页面 顾客只开发部分页面

        A

        在127.0.0.1/8000/admin/group 中设置两种分组 admin 和  customer

        然后再创建两个用户分别放入小组

         -对用户权限进行限制 套入三层函数 第一层输入的参数是通过权限的分组 第二层是对应的页面

      

    def allowed_user(allowed_roles= []):
        def decorators(views_func):
            def wrapper_func(request, *args, **kwargs):
                group = None
                if request.user.groups.exists():
                    group = request.user.groups.all()[0].name
                if group in allowed_roles:
                    return views_func(request, *args, **kwargs)
                else:
                    return HttpResponse('You are not authorized to views this page')
            return wrapper_funcd
        return decorators

        -再以@的形式添加到需要限制权限的函数页面上面

    @login_required(login_url='login')
    @allowed_user(allowed_roles=['admin'])
    def home(request):
        customer = Customer.objects.all()
        order = Order.objects.all()
        total_order = order.count()
        Delivered = Order.objects.filter(status='Delivered').count()
        Pending = Order.objects.filter(status='Pending').count()
    
        context = {'customer':customer,'order':order,'total_order':total_order,'Delivered':Delivered,'Pending':Pending}
    
        return render(request, 'accounts/home.html',context)
    
    @login_required(login_url='login')
    @allowed_user(allowed_roles=['admin'])
    def customer(request, pk):
    
        customer = Customer.objects.get(id=pk)
        order = customer.order_set.all()
        total_order = order.count()
    
        myfilter = OrderFilter(request.GET, queryset=order)
        order = myfilter.qs
    
        context = {'customer':customer, 'order':order, 'total_order':total_order
                   ,'myfilter':myfilter}
    
        return render(request, 'accounts/customer.html', context)

        -优化代码

        对于顾客登录HOME页面的@函数进行修改 顾客登录后看到是user页面

        -创建userPage的url 模板 函数

        -在decorator。py写入admin_only

    def admin_only(views_func):
        def wrapper_func(request, *args, **kwargs):
            group = None
            if request.user.groups.exists():
                group = request.user.groups.all()[0].name
            if group == 'customer':
                return  redirect('userPage')
            if group == 'admin':
                return views_func(request,*args, *kwargs)
    
        return wrapper_func

        -将其@在home函数上面

    @login_required(login_url='login')
    @admin_only
    def home(request):
        customer = Customer.objects.all()
        order = Order.objects.all()
        total_order = order.count()
        Delivered = Order.objects.filter(status='Delivered').count()
        Pending = Order.objects.filter(status='Pending').count()
    
        context = {'customer':customer,'order':order,'total_order':total_order,'Delivered':Delivered,'Pending':Pending}
    
        return render(request, 'accounts/home.html',context)

        -在对模板Navtar写if 语句  目的是不让顾客看到home 和 customer

     {% if request.user.is_staff %}
          <li class="nav-item active">
            <a class="nav-link" href="{% url 'home' %}">Dashboard</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="{% url 'products' %}">Products</a>
          </li>
      {% endif %}

        -对于新注册进来的顾客 我们要自动把他们分入customer组

             因此我们需要对register函数进行操作、

         -首先引入user内的models模板

    from django.contrib.auth.models import Group 

         -在register函数里

          用sql把name写入分组   

            if form.is_valid():
                user = form.save()
                username = form.cleaned_data.get('username')
    
                group = Group.objects.get(name='customer')
                user.groups.add(group)

        新注册好的用户自动分入customer组

          

  • 相关阅读:
    python之元组
    python之dict
    python之list
    python之str字符串
    python之for循环
    Python的基本语法2
    Python的基本语法1
    初识python
    JS获取当天是周几
    EXCLE导入数据库
  • 原文地址:https://www.cnblogs.com/kangkang1999/p/13413050.html
Copyright © 2011-2022 走看看