【注意】最后更新于 January 17, 2020,文中内容可能已过时,请谨慎使用。
之前的登陆什么的都是自己利用数据库查询,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>
|
总结
- 利用Django自带的User表可以实现自动验证,此外,可以对User进行扩展,
user=models.OneToOneField(User,on_delete=models.CASCADE)
- 利用authenticate实现验证
from django.contrib.auth import authenticate,login,logout user=authenticate(username=username,password=password,role=role)
- 验证通过,利用login进行登录
from django.contrib.auth import authenticate,login,logout login(request,user) #验证通过,登录
- 利用logout进行退出
from django.contrib.auth import authenticate,login,logout logout(request)
- 利用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
文章作者
lixueping
上次更新
2020-01-17
(3d6538b)
许可协议
MIT