【思路】:
1、在数据库拥有用户名和密码(未加密)的前提下,通过登录入口页面登录;
2、通过django的cookie和session,记录用户登录信息;
3、采用django的中间件,来实现除了登录页面外的其他页面,权限访问实现问题;
4、通过注销session,来注销用户的登录;
第一步:模板页面 login.html
<!DOCTYPE html>
{% load staticfiles %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>系统登录</title>
<link href="{% static 'css/bootstrap.css' %}" rel="stylesheet">
<style>
a, a:hover {
color: #ffffff;
}
.login {
width: 400px;
height: 330px;
margin: 200px auto;
border: 1px silver solid;
padding: 15px 30px;
box-shadow: 5px 15px 35px rgba(0, 0, 0, 0.1);
font-weight: bold;
}
.login h2 {
text-align: center;
padding-bottom: 20px;
}
.login span ul {
padding-inline-start: 0px;
}
.login span ul li {
list-style-type: none;
padding-left: 0px;
font-size: 12px;
padding-top: 4px;
}
</style>
</head>
<body>
<div class="login">
<h2> 沃尔用户登录 </h2>
<form method="post" novalidate>
{% csrf_token %}
<div class="form-group">
<label>用户名</label>
{{ form.name }}
<span style="color: red;">{{ form.name.errors }}</span>
</div>
<div class="form-group">
<label>密 码</label>
{{ form.pwd }}
<span style="color: red;">{{ form.pwd.errors }}</span>
</div>
<button type="submit" class="btn btn-default btn-primary" style="float: right;">登 录</button>
</form>
</div>
<script src="{% static 'js/jquery-3.6.1.min.js' %}" type="application/javascript"></script>
<script src="{% static 'js/bootstrap.min.js' %}" type="application/javascript"></script>
</body>
</html>
第二步:路由页面 url.py
urlpatterns = [
# 登录
path('login/',views.login, name='login'),
path('logout/',views.logout, name='logout'),
]
第三步:路由页面 views.py
# 自定义bootstrap样式插件 导入
from xitong.uitls.Bootstrap import BootstrapModelForm,BootstrapForm
###### 登录 ######
class LoginForm(BootstrapForm):
name = forms.CharField(
label="用户名",
widget=forms.TextInput,
required=True, # 必填
)
pwd = forms.CharField(
label = "密 码",
widget= forms.PasswordInput(render_value=True),
# render_value=True 密码值填写错误后,不会丢失
required=True,
)
def login(request):
if request.method == "GET":
form = LoginForm()
return render(request,'xitong/login.html', {"form":form})
form = LoginForm(data=request.POST)
if form.is_valid():
obj = User.objects.filter(**form.cleaned_data).first()
if not obj:
form.add_error('pwd','用户名或密码错误!') # 主动添加错误信息提示
return render(request, 'xitong/login.html', {"form": form})
# 用户名密码正确
# 网站生成随机字符串,写到浏览器的cookie和session中
request.session['info'] = {'id':obj.id, 'name':obj.name}
return redirect('/xitong/user/list/')
return render(request, 'xitong/login.html', {"form": form})
def logout(request):
""" 注销直接clear()方法进行清除session """
request.session.clear()
return redirect('/xitong/longin/')
第四步:创建中间件目录,并且在setting.py导入
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'xitong.middleware.login.loginMiddleware', #此处导入 自定义的中间件
]
然后,在根目录创建目录middleware,创建文件login.py ,新建类
# 中间件必须引入,次内容
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
class loginMiddleware(MiddlewareMixin): #在该类中,继承中间件类名
""" 用户登录 权限设置 """
def process_request(self,request):
# 排除登录地址,不需要验证的页面
login_url = request.path_info # 获取当前请求页面的url,排查登录页面
if login_url == '/xitong/login/':
return
obj_session = request.session.get('info')
# 如果方法中没有返回值 (返回None) . 继续向后走
# 如果有返回值 HttpResponse, render, redirect 则不再继续向后执行.
if obj_session:
return
return redirect('/xitong/login/')
最后,在右上角的个人用户名模板调用,可以用 {{ request.session.info.name }} 来调用用户名,或者用户头像图片等
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ request.session.info.name }}<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="#">修改密码</a></li>
<li role="separator" class="divider"></li>
<li><a href="/xitong/logout/">注销登录</a></li>
</ul>
</li>
希望对正在学习的你有所帮助,用户登录功能不完善的地方,希望留言讨论哦!