zoukankan      html  css  js  c++  java
  • 潭州课堂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
    

      




  • 相关阅读:
    ege图形化编程配置过程及出现的问题解决方法
    两个头文件相互包含导致未定义类型
    20180318CSP比赛
    jdk7和jdk8都下载了 如何设置java版本为jdk7?
    CCF|CSP|模拟试题|游戏
    2018蓝桥杯|基础练习|十六进制转八进制
    2018蓝桥杯|历届试题|翻硬币
    2018蓝桥杯|历届试题|数字游戏
    2020年9月18日 可变字符序列:StringBuffer和StringBuilder(尽量掌握底层代码跟踪分析的能力)
    2020年9月17日 String 常用方法四、五、六、七、八、九
  • 原文地址:https://www.cnblogs.com/gdwz922/p/10242444.html
Copyright © 2011-2022 走看看