zoukankan      html  css  js  c++  java
  • Django 13 admin和auth系统、权限问题

    一、auth系统

      auth系统的数据表

    #User:User是auth模块中维护用户信息的关系模式(继承了models.Model), 数据库中该表被命名为auth_user.
    #Group:User对象中有一个名为groups的多对多字段, 多对多关系由auth_user_groups数据表维护。Group对象可以通过user_set反向查询用户组中的用户。
    #Permission:Django的auth系统提供了模型级的权限控制, 即可以检查用户是否对某个数据表拥有增(add), 改(change), 删(delete)权限。

      User模型常用属性和方法

    username           #用户名
    email             #邮箱
    groups         #多对多的组
    user_permissions   #多对多的用户权限
    is_staff       #是否是admin的管理员
    is_active       #是否激活,判断该用户是否可用
    is_superuser     #是否是超级用户
    last_login      #上次登录时间
    dete_joined       #注册时间
    is_authenticated   #是否验证通过了
    is_anonymous        #是否是匿名用户
    set_password(raw_password) #设置密码,传原生密码进去
    check_password(raw_password) #检查密码
    has_perm(perm)     #判断用户是否有某个权限
    has_perm(perm_list)   #判断用户是否有权限列表中的某个列表

      auth认证系统的功能

    create_user #创建用户
    authenticate #验证登录
    login #记住用户的登录状态
    logout #退出登录
    is_authenticated #判断用户是否登录
    login_required #判断用户是否登录的装饰器

      运用auth系统

    from django.shortcuts import render,reverse,redirect
    from .forms import RegisterForm,LoginForm
    from .models import UserModel
    # Create your views here.
    from django.contrib.auth.models import User,Permission,Group #从auth系统导入User,Permission,Group 表
    from django.contrib.auth import login,logout,authenticate #导入login,logout,authenticate三个方法
    
    def home(request):
        return render(request,'login/home.html')
    
    def register(request):
        if request.method == 'GET':
            return render(request,'login/register.html')
        if request.method == 'POST':
            form = RegisterForm(request.POST)
            if form.is_valid():
                username = form.cleaned_data.get('username')
                password = form.cleaned_data.get('password')
                password_repeat = form.cleaned_data.get('password_repeat')
                email = form.cleaned_data.get('email')
                if password == password_repeat:
                    # UserModel.objects.create(username = username,password = password,email = email)
                    User.objects.create_user(username=username,password=password,email=email) #用create_user自动给密码加密
                    return redirect(reverse('login_login'))
                else:
                    return redirect(reverse('login_register'))
            return redirect(reverse('login_register'))
        return redirect(reverse('login_register'))
    
    def login_view(request):
        if request.method == 'GET':
            return render(request,'login/login.html')
        if request.method == 'POST':
            form = LoginForm(request.POST)
            if form.is_valid():
                username = form.cleaned_data.get('username')
                password = form.cleaned_data.get('password')
                # user = UserModel.objects.filter(username=username,password=password)
                user = authenticate(username=username,password=password) #自动验证数据库是否有该用户,自动密码解密
                if user:
                    # request.session['username'] = username
                    login(request,user) #这种方式实现登录状态
                    return redirect(reverse('login_home'))
                else:
                    return redirect(reverse('login_register'))
            return redirect(reverse('login_register'))
        else:
            return redirect(reverse('login_register'))
    
    def logout_view(request):
        # request.session.flush()
        logout(request) #这种方式实现退出用户
        return render(request,'login/login.html')

    二、设置blog主页的登录权限

      为了实现在进入博客页面之前必须得登录(就是设置登录权限)

    #1、setting.py最后添加
    LOGIN_URL = '/login/login' #把这个页面设置成登录页面,只要没登录就会跳转这个页面
    
    #2、在想要设置权限的地方加上装饰器,在blog的app主页里面添加
    from django.contrib.auth.decorators import login_required,permission_required
    
    @login_required #实现登录权限;想要进入这个页面,如果没有登录,就会跳转到默认登录页面
    def index(request):
        '''
        主页
        '''
        return render(request,'blog/demo_index.html')
    
    #3、为了用户体验而言,实现登录用户后直接跳转到博客页面而不是主页,从GET里面获取next的url,在保持用户登录状态之后添加代码
                if user:
                    # request.session['username'] = username
                    login(request,user) #这种方式实现登录状态
                    next_url = request.GET.get('next') #为了用户体验而言,实现登录用户后直接跳转到博客页面而不是主页,从GET里面获取next的url
                    if next_url: #如果存在,跳转到该url
                        return redirect(next_url)
                    return redirect(reverse('login_home'))

    三、关于权限

    #在auth系统当中,django已经为我们提供了一个用户身份验证,用户组和权限管理这些功能, 那么就可以使用它来完善我们现有的这个项目.

      修改用户密码

    def test(request):
        xcc = User.objects.filter(username='xuchengcheng').first()
        xcc.set_password('qwe123') #修改密码
        xcc.save()
        return HttpResponse(111111)

      设置添加博客权限

    @permission_required('blog.add_blogmodel') #设置app名blog下的add_blogmodel权限,用户必须有这个权限才能添加博客
    def add(request):
        '''
        添加页
        '''
        pass

      添加权限方式

    def test(request):
        #给小明一个添加博客的权限
        xiaoming = User.objects.filter(username='xiaoming').first() #获取用户
        add_blog_permission = Permission.objects.filter(codename='add_blog').first() #获取权限
        xiaoming.user_permissions.add(add_blog_permission) #给用户添加权限
    
        #给组增加一个添加博客的权限,将用户放入这个组里面就可以实现添加博客权限
        g1 = Group()
        g1.name = 'add_blog_permission' #设置组
        g1.save()
        g1.permissions.add(add_blog_permission) #给组添加权限
        g1 = Group.objects.filter(name='add_blog_permission')
        xiaohong = User.objects.filter(username='xiaohong').first()
        print(xiaohong)
        g1.user_set.add(xiaohong) #将小红添加到这个组
    
        return HttpResponse(111111)

  • 相关阅读:
    解决使用gomod后goland导包报红问题
    Golang写文件的坑
    Golang去除字符串前后空格
    Golang通过结构体解析和封装XML
    Golang获取CPU、内存、硬盘使用率
    Golang数组和切片的区别
    Golang修改操作系统时间
    Golang中GBK和UTF8编码格式互转
    Golang中的各种时间操作
    Golang十六进制字符串和byte数组互转
  • 原文地址:https://www.cnblogs.com/xuchengcheng1215/p/9457950.html
Copyright © 2011-2022 走看看