django之auth系统

1-Auth系统中的表

(1)auth系统的数据表

在这里插入图片描述
从表的名称我们就能看出,
auth_user,auth_group,auth_permission分别
存放了用户,用户组,权限的信息表.
另外三张表就是多对多的关系表

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

(2)auth系统中User模型常用属性和方法

在这里插入图片描述

(3)auth认证系统功能

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

(4)使用auth系统

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

接下来我们要在现有的项目中实现以下功能:

1.使用内置的auth_user表来存储用户注册信息.

2.使用auth系统中的login,logout,authenticate实现登录,退出和验证登录

3.给blog中的视图设置登录使用权限

4.给添加博客设置用户的权限

准备工作:
1.创建一个新的app,并将app注册.
2.准备好之前使用过的登录注册的模板和form表单的验证.
3.给视图配置好相应的url路由.
4.导入我们需要使用的auth中的User模型,login,logout,authenticate方法.

注意: 对于这个登录注册的例子中, 我们把之前自己定义的模型类改成了使用auth系统中的User模型类, 在User类中同样存在着用户名,密码,邮箱这几个字段,
所以我们可以继续使用之前的form表单和之前用过的模板

(5)使用auth系统实现登录注册

1-使用auth系统实现登录注册

2-使用auth系统实现状态保持与退出

3-login_required装饰器

在没有登录的状态下去访问我们的blog中主页的url时就会出现跳转到登录页

4-next url的使用

从刚才的登录页跳转中,我们会看到一个next的参数,
这个参数前面的需要登录的那个视图的url
在这里插入图片描述
代码:
views.py

python
from django.contrib.auth.decorators import login_required
from django.shortcuts import render,redirect,reverse
from django.views import View
from django.http import HttpResponse
from django.contrib.auth.models import User #导入User模型 (注册)
from django.contrib.auth import login , logout #保存状态
from django.contrib.auth import authenticate  #认证django提供的用户表

def index(request):
    """
    查找 如果查到了就直接显示登录状态  没有就提示登录
    :param request:
    :return:
    """
    return render(request,'zuoye/index.html')


def exit(request):
    logout(request)
    return redirect(reverse("zuoye:index"))
    #注册
class RegistView(View):
    def get(self,request):
        return render(request,"zuoye/res.html")

    def post(self, request):
        username = request.POST.get("username")
        password = request.POST.get("password")
        email = request.POST.get("email")
        #print(email)

        #存入数据到表中
        User.objects.create_user(username=username,password=password,email=email)  #创建普通用户

        return HttpResponse("普通用户注册成功!")

#登录

class LogView(View):
    def get(self,request):
        return render(request,'zuoye/log.html')

    def post(self, request):
        username = request.POST.get("username")
        # request.session["username"] = username
        # request.session.set_expiry(7 * 24 * 3600)
        password = request.POST.get("password")
        #查询用户表中用户是否存在
        user = authenticate(username=username,password=password)

        if user:
            login(request,user) #直接登录 保存状态
            next_url = request.GET.get("next")
            if next_url:
                print(next_url)
                return redirect(next_url) #没有权限 就返回到之前的页面
            return HttpResponse("登录成功") #没有参数就显示登录成功
        else:
            return HttpResponse("用户名或者密码错误!")


#第一种方式  如果用户没有登录  跳转到登录页
"""def Detail(request):
    if request.user.is_authenticated: #判断用户是否登录
        return HttpResponse("AAAAAA")
  else:
        return redirect("zuoye:log")
"""
#第二种方式  使用函数装饰器
@login_required
def Detail(request):
    return HttpResponse("AAAAAA")

urls.py中配置

from django.urls import path
from . import views
app_name = "zuoye"
urlpatterns = [ 
  	path('res/',views.RegistView.as_view(),name="res"),
    path('log/',views.LogView.as_view(),name="log"),
    path('index/',views.index,name="index"),
    path('exit/',views.exit,name="exit"),
    path('detail/',views.Detail,name="detail"),
]

settings.py中配置跳转路由

LOGIN_URL = "/zuoye/log"  #如果用户没有登录  就跳转到登录页

templates模板下的app目录下index.html log.html res.html 分别为首页 登录 注册
index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
{{ request.user }}<br>
<a href="{% url 'zuoye:detail' %}">详情页</a><br>
<a href="{% url 'zuoye:res' %}">注册</a><br>
<a href="{% url 'zuoye:log' %}">登录</a><br>
<a href="{% url 'zuoye:exit' %}">退出</a>
</body>
</html>

log.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="请输入用户名"><br>
    <input type="password" name="password" placeholder="请输入密码"><br>
    <input type="checkbox" name="remember">记住我 <br>
    <input type="submit" value="提交登录"><br>
</form>
</body>
</html>

res.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="请输入用户名"><br>
    <input type="password" name="password" placeholder="请输入密码"><br>
    <input type="email" name="email" placeholder="请输入邮箱号"><br>
    <input type="submit" value="提交注册"><br>

</form>
</body>
</html>

2-登录注册实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3-权限的实现(增删改查)

在这里插入图片描述
查看数据库中auth_permission这张表,在里面有所有的表的一些操作权限,这些是在表创建的同是添加进来的数据

(1)permission_required装饰器

@permission_required("zuoye.delete_users") #app.delete_users 添加权限
def delete_user(request):
    Users.objects.all().first().delete() #普通用户没有权限  用户没有登录 没有权限删除
    return HttpResponse("删除成功")

(2)Permission权限模型

注意:如果是超级用户是拥有所有权限的

#查看普通用户能够添加什么权限
在这里插入图片描述
views.py

python
from django.contrib.auth.decorators import login_required,permission_required
from django.contrib.auth.models import User,Permission #导入User模型 (注册) 权限表
from .models import Users #自定义的模型表
#第二种方式  使用函数装饰器
@login_required
def Detail(request):
    sang = User.objects.get(id=3)  #用户表
    delete_user = Permission.objects.get(id=27) #权限表  删除权限
    sang.user_permissions.add(delete_user) #添加权限
    return HttpResponse("AAAAAA")



#添加权限

#删除用户
@permission_required("zuoye.delete_users") #app.delete_users 添加权限
def delete_user(request):
    Users.objects.all().first().delete() 
    #普通用户没有权限  用户没有登录 没有权限删除
    return HttpResponse("删除成功")

models.py

from django.db import models

# Create your models here.
class Users(models.Model):
    username = models.CharField(max_length=20,unique=True,verbose_name="用户名")
    password = models.CharField(max_length=200,verbose_name="密码")

效果演示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

group:组

在这里插入图片描述

views.py

def Detail(request):
    # sang = User.objects.get(id=3)  #用户表
    # delete_user = Permission.objects.get(id=27) #权限表  删除权限
    # sang.user_permissions.add(delete_user) #添加权限

    #给组添加权限
    Group.objects.get_or_create(name="vip1")
    
    return HttpResponse("AAAAAA")

在这里插入图片描述
给组添加权限

@login_required
def Detail(request):
    # sang = User.objects.get(id=3)  #用户表
    # delete_user = Permission.objects.get(id=27) #权限表  删除权限
    # sang.user_permissions.add(delete_user) #添加权限

    #给组添加权限
    #Group.objects.get_or_create(name="vip1")
    vip = Group.objects.get(id=1)
    delete_user = Permission.objects.get(id=27)
    vip.permissions.add(delete_user)
    
    #把用户放入组中
    
    return HttpResponse("AAAAAA")

在这里插入图片描述
在这里插入图片描述
将用户分入组中
在这里插入图片描述
在这里插入图片描述
views.py

@login_required
def Detail(request):
    #把用户放入组中
    vip = Group.objects.get(id=1)
    hh = User.objects.get(id=6)
    hh.groups.add(vip) #将用户添加进组中
    return HttpResponse("AAAAAA")

效果演示:

在这里插入图片描述
说明组中的用户添加权限成功

猜你喜欢

转载自blog.csdn.net/qq_42662411/article/details/104835780
今日推荐