之前的登陆什么的都是自己利用数据库查询,form组件,cookie及session保存状态实现的,比较花费时间,而Django自带的登录认证能帮助我们快速开发

数据库部分

在我们在models.py创建表时,会发现Django会自动创建很多表,其中有一个表名为:auth_user

这个表就是Django自带的用户表,可以利用它来实现登录认证等,先看一下这个表字段有哪些:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Django Auth模块自带User模型所包含字段

username:用户名
email: 电子邮件
password:密码    
first_name:名
last_name:姓
is_active: 是否为活跃用户。默认是True
is_staff: 是否为员工。默认是False
is_superuser: 是否为管理员。默认是False
dat_joined: 加入日期。系统自动生成。

在models.py里的相关操作:

1
2
3
4
5
6
from django.contrib.auth.models import User
'''因为要用到它,所以要先导入'''
class UserInfo(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)   
    #和自带的User表一对一关联
    role=models.CharField(max_length=32)  #可以加扩展信息字段,比如年龄,性别,角色

这里注意一个问题,调试用的数据可以通过admin来添加,之后还有注册功能来添加数据

URL部分

1
2
3
4
5
6
7
urlpatterns = [
    path('admin/', admin.site.urls),
    path('login',views.acc_login),
    path('logout',views.acc_logout,name="logout"), #模板里可以由name值通过{% url 'logout' %}获取url
    path('crm',views.crm),

]

settings.py部分

LOGIN_URL=”/login” #(视图函数登录权限跳转要用)

Views部分

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from django.shortcuts import render,redirect
from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.decorators import login_required
#

@login_required  #没有登录直接访问的话,会根据settings.py中的LOGIN_URL="/login"跳转(有一个默认的)
def crm(request):
    return render(request,"userinfo.html")
def acc_login(request):
    error_msg=' '
    if request.method=="GET":
        return render(request, "login.html")
    if request.method=="POST":
        username=request.POST.get("username")
        print(username)
        password=request.POST.get("password")
        print(password)
        user=authenticate(username=username,password=password)  #只是验证功能,还没有登录
        if user:
            print(user)        #username
            print(type(user))  #<class 'django.contrib.auth.models.User'>
            login(request,user)   #验证通过,登录
            #内部有request.user=user     可以用模板{{request.user}}
            return redirect(request.GET.get("next",'/crm'))    #http://127.0.0.1:8080/login?next=/crm
            #登录成功默认跳转用户信息页面,如果是其他页面来的,登录后跳转到其他页面
        else:
            print(user)        #None
            print(type(user))  #<class 'NoneType'>
            error_msg="用户名或密码错误"
        return render(request, "login.html", {"error_msg":error_msg})
def acc_logout(request):
    logout(request)
    return redirect('/login')

HTML部分

userinfo.html

1
2
3
4
<body>
    <div><a href="">{{ request.user }}</a></div>
    <div><a href="{% url 'logout' %}">退出</a></div>
</body>

login.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<body>
 <div class="container">

      <form class="form-signin" method="post" novalidate>
          {% csrf_token %}
        <h2 class="form-signin-heading">请登录</h2>

        <input type="text" id="inputEmail" class="form-control" placeholder="username" name="username" required autofocus>

        <input type="text" id="inputPassword" class="form-control" placeholder="Password" name="password" required>
          <div><span STYLE="color: red">{{ error_msg }}</span></div>
        <div class="checkbox">
          <label>
            <input type="checkbox" value="remember-me"> Remember me
          </label>

        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
      </form>

    </div> <!-- /container -->

</body>

总结

  1. 利用Django自带的User表可以实现自动验证,此外,可以对User进行扩展,

user=models.OneToOneField(User,on_delete=models.CASCADE)

  1. 利用authenticate实现验证

from django.contrib.auth import authenticate,login,logout user=authenticate(username=username,password=password,role=role)

  1. 验证通过,利用login进行登录

from django.contrib.auth import authenticate,login,logout login(request,user) #验证通过,登录

  1. 利用logout进行退出

from django.contrib.auth import authenticate,login,logout logout(request)

  1. 利用login_required给其他url加登录权限要求

@login_required #没有登录直接访问的话,会根据settings.py中的LOGIN_URL="/login"跳转(有一个默认的) def crm(request): return render(request,"userinfo.html")

在访问需要登录权限的url是,会根据settings.py里LOGIN_URL进行跳转,跳转之后url:

http://127.0.0.1:8080/login?next=/crm

可在登录成功跳转进行设置:

return redirect(request.GET.get(“next”,'/crm’))

如果是从login页面直接登录的就跳转到crm 如果是其他url跳转login登录的,成功之后还跳转到其他url

版权声明:本文为CSDN博主「月守护」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/csdniter/article/details/96992678