Django2自带用户登录注册功能总结

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


数据库部分:


在我们在models.py创建表时,会发现Django会自动创建很多表,
其中有一个表名为:auth_user
这个表就是Django自带的用户表,可以利用它来实现登录认证等
先看一下这个表字段有哪些:

Django Auth模块自带User模型所包含字段

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

在models.py里的相关操作:

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部分

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部分

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))  #
            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))  #
            error_msg="用户名或密码错误"
        return render(request, "login.html", {"error_msg":error_msg})
def acc_logout(request):
    logout(request)
    return redirect('/login')

HTML部分

userinfo.html

<body>
<div><a href="">{{ request.user }}a>div>
<div><a href="{% url 'logout' %}">退出a>div>
body>

login.html

<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> 

body>

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

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

2.利用authenticate实现验证

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

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

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

4.利用logout进行退出

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

5.利用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

你可能感兴趣的:(Django,总结)