• 潭州课堂25班:Ph201805201 django 项目 第三十五课 后台用户权限的添加 mixins 课堂笔记)


     验证用户登录:

    对一个视图函数进行登录权限验证,(登录后才可以访问,否则重定向到登录页面)

    #from django.contrib.auth.decorators import login_required
    # @login_required(login_url='news:login')
    # def index(request):
    # return

    对一个类视图进行登录权限验证,(登录后才可以访问,否则重定向到登录页面)
    # @method_decorator(login_reqirde(login_url='news:login', name='dispatch))
    # class Index(View):
    # def get(self, request):
    # pass


    导入
    from django.contrib.auth.mixins import LoginRequiredMixin
    继承 LoginRequiredMixin
    设定 login_url 重定向参数

     也可以在主目录下的配置文件中设置,(只设置一次,以后不必再设置)、


    在末行添加:LOGIN_URL = 'USERS:LOGIN'



    用户权限管理:
    from django.contrib.auth.decorators import permission_required

    对新闻删除进行权限管理,,返回403
    @permission_required('news:delete_news', raise_exception=True )
    def index(request):
    pass

    在类中使用:
    from django.contrib.auth.mixins import PermissionRequiredMixin
      PermissionRequiredMixin 一定要在左边
    class Index(PermissionRequiredMixin, View):
      #  指定权限   在 auth 权限表中的增,删,改,查
      permission_required = ('news:add_tag', 'news:view_tag')
      # 如果没有权限,报403异常
      raise_exception=True
      
    def get(self, request):
    pass

    为实力添加权限管理
    import json
    import logging
    
    
    from django.shortcuts import render
    from django.views import View
    from django.db.models import  Count      # django自带的计算
    # from django.contrib.auth.decorators import login_required
    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.contrib.auth.mixins import PermissionRequiredMixin
    from django.contrib.auth.decorators import permission_required
    
    from ..news import models                # 导入相关数据库
    from utils.json_fun import to_json_data
    from utils.res_code import Code,error_map
    
    logger = logging.getLogger('django')
    
    class  Index(LoginRequiredMixin, View):
        '''
        创建 admin 主页视图
        '''
        login_url = 'users:login'
        def get(self, request):
            return render(request, 'admin/index/index.html')
    
    
    class  TagManager(PermissionRequiredMixin, View):
        '''
        创建标签管理视图
        /admin/tags/
        '''
        #  指定权限   在 auth 权限表中的增,删,改,查
        permission_required = ('news:add_tag', 'news:view_tag')
        # 如果没有权限,报403异常
        raise_exception=True
    
        def get(self, request):
            #      查询新闻分类表 did,类名,及类下的新闻文章总数
            #      跟上条件:没有被逻辑删除的,排序:文章总数,修改时间,
            tags = models.Tag.objects.values('id', 'name').annotate(num_news=Count('news')).
                filter(is_delete=False).order_by('-num_news', '-update_time')
    
            return render(request, 'admin/news/tags_manage.html', locals())
    
    
        def post(self, request):
            '''
            添加新标签
            :param request:
            :return:
            '''
            json_data = request.body
            if not json_data:
                return to_json_data(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR])
            # 将 json 转化为 dict
            dict_data = json.loads(json_data.decode('utf8'))
            tag_name = dict_data.get('name')
             # 清洗去空格
            if tag_name:
                tag_name = tag_name.strip()
                #  如果存在,取出来,如果不存在,创建一个
                # 返回是个元祖
                tag_up = models.Tag.objects.get_or_create(name=tag_name)
                #  tag_bole 第二个元素如果是 False,说明 name 存在,并取出
                # 如果是 True 创建
                #  tag_inst 查询集
                tag_inst, tag_bole = tag_up
    
                # 来着构造一个字典
                new_tag_dist = {
                    'id':tag_inst.id,
                    'name':tag_inst.name
                }
    
                # if tag_bole:
                #     return to_json_data(errmsg='标签创建成功', data=new_tag_dist)
                # else: to_json_data(errno=Code.DATAEXIST, errmsg='标签已存在')
                # 等于如下语句
                return to_json_data(errmsg='标签创建成功', data=new_tag_dist) if tag_bole else 
                    to_json_data(errno=Code.DATAEXIST, errmsg='标签已存在')
    
            else:return to_json_data(errno=Code.PARAMERR, errmsg='标签名不能为空')
    
    
    
    class TagEdit(PermissionRequiredMixin, View):
        '''
        删除,更改,标签类
        /admin/tags
        '''
        permission_required = ('news:add_tag', 'news:view_tag')
        # 如果没有权限,报403异常
        raise_exception=True
    
        def delete(self, request, tag_id):
            # 删除
            tag = models.Tag.objects.only('id').filter(is_delete=False, id=tag_id).first()
            if tag:
                # tag.delete()   # 真的删除
                # 逻辑删除
                tag.is_delete = True
                # tag.save()
                tag.save(update_fields=['is_delete'])           # 优化措施:只对指定字段保存
                return to_json_data(errmsg='标签删除成功')
            else:
                return to_json_data(errno=Code.PARAMERR,errmsg='您要删除的标签不存在')
    
    
        def put(self, request, tag_id):
            '''
            更改标签
            :param request:
            :return:
            '''
            # 拿到前台传来的参数
            json_data = request.body
            if not json_data:
                return to_json_data(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR])
            # 将 json 转化为 dict
            dict_data = json.loads(json_data.decode('utf8'))
            tag_name = dict_data.get('name')
    
            tag = models.Tag.objects.only().filter(id=tag_id).first()
            if tag:
                                # 清洗去空格
                if tag_name :
                    tag_name = tag_name.strip()
                    # 如果新命名的 name 在标签中不存在
                    if not models.Tag.objects.only('name').filter(name=tag_name).exists():
                        # 把新的 name 给存入
                        tag.name = tag_name
                        tag.save(update_fields=['name'])                       # 优化措施
                        return to_json_data(errmsg='标签更改成功')
                    else: return to_json_data(errno=Code.PARAMERR,errmsg='该标签已经存在')
                else: return to_json_data(errno=Code.PARAMERR,errmsg='标签名不能为空')
            else: return to_json_data(errno=Code.PARAMERR,errmsg='您要更改的标签不存在')
    
    
    
    # @login_required(login_url='news:login')
    
    # @permission_required('news:delete_news', raise_exception=True )
    # def index(request):
    #     pass
    
    
    # class Index(PermissionRequiredMixin, View):
    #     def get(self, request):
    #         pass
    

      




  • 相关阅读:
    腾讯2014 笔试
    iOS 并发编程之 Operation Queues
    iOS 架构
    loadView and viewDidLoad?
    Referring to weak self inside a nested block
    Weakify和strongify探究
    iOS开发的最佳实践
    iOS 书籍
    Object-C非正式协议与正式协议的区别
    解决element-ui中el-menu组件作为vue-router模式在刷新页面后default-active属性与当前路由页面不一致问题的方法
  • 原文地址:https://www.cnblogs.com/gdwz922/p/10242444.html
Copyright © 2020-2023  润新知