之前的登陆什么的都是自己利用数据库查询,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来添加,之后还有注册功能来添加数据
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),
]
LOGIN_URL="/login" #(视图函数登录权限跳转要用)
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')
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