登录
def login(request):
''' 登录 '''
if request.method == "GET":
form = LoginForm()
return render(request, 'login.html', {'form': form})
form = LoginForm(data=request.POST)
if form.is_valid():
# print(form.cleaned_data)
admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
if not admin_object:
form.add_error("password", "用户名或密码错误") # 如果没有找到信息
return render(request, 'login.html', {'form': form})
# 用户名和密码正确
request.session['info'] = {'id': admin_object.id, 'name': admin_object.username}
return redirect('/admin/list/')
return render(request, 'login.html', {'form': form})
如果输入的用户名和密码正确,就创建一个cookie,并在request中的session中储存参数。已用于中间件的验证。
html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
a {
text-decoration: none;
}
input,
button {
background: transparent;
border: 0;
outline: none;
}
body {
height: 100vh;
background: linear-gradient(#141e30, #243b55);
display: flex;
justify-content: center;
align-items: center;
font-size: 16px;
color: #03e9f4;
}
.loginBox {
width: 400px;
height: 364px;
background-color: #0c1622;
margin: 100px auto;
border-radius: 10px;
box-shadow: 0 15px 25px 0 rgba(0, 0, 0, .6);
padding: 40px;
box-sizing: border-box;
}
h2 {
text-align: center;
color: aliceblue;
margin-bottom: 30px;
font-family: 'Courier New', Courier, monospace;
}
.item {
height: 45px;
border-bottom: 1px solid #fff;
margin-bottom: 40px;
position: relative;
}
.item input {
width: 100%;
height: 100%;
color: #fff;
padding-top: 20px;
box-sizing: border-box;
}
.item input:focus+label,
.item input:valid+label {
top: 0px;
font-size: 2px;
}
.item label {
position: absolute;
left: 0;
top: 12px;
transition: all 0.5s linear;
}
.btn {
padding: 10px 20px;
margin-top: 30px;
color: #03e9f4;
position: relative;
overflow: hidden;
text-transform: uppercase;
letter-spacing: 2px;
left: 35%;
}
.btn:hover {
border-radius: 5px;
color: #fff;
background: #03e9f4;
box-shadow: 0 0 5px 0 #03e9f4,
0 0 25px 0 #03e9f4,
0 0 50px 0 #03e9f4,
0 0 100px 0 #03e9f4;
transition: all 1s linear;
}
.btn>span {
position: absolute;
}
.btn>span:nth-child(1) {
width: 100%;
height: 2px;
background: -webkit-linear-gradient(left, transparent, #03e9f4);
left: -100%;
top: 0px;
animation: line1 1s linear infinite;
}
@keyframes line1 {
50%,
100% {
left: 100%;
}
}
.btn>span:nth-child(2) {
width: 2px;
height: 100%;
background: -webkit-linear-gradient(top, transparent, #03e9f4);
right: 0px;
top: -100%;
animation: line2 1s 0.25s linear infinite;
}
@keyframes line2 {
50%,
100% {
top: 100%;
}
}
.btn>span:nth-child(3) {
width: 100%;
height: 2px;
background: -webkit-linear-gradient(left, #03e9f4, transparent);
left: 100%;
bottom: 0px;
animation: line3 1s 0.75s linear infinite;
}
@keyframes line3 {
50%,
100% {
left: -100%;
}
}
.btn>span:nth-child(4) {
width: 2px;
height: 100%;
background: -webkit-linear-gradient(top, transparent, #03e9f4);
left: 0px;
top: 100%;
animation: line4 1s 1s linear infinite;
}
@keyframes line4 {
50%,
100% {
top: -100%;
}
}
</style>
</head>
<body>
<div class="loginBox">
<h2>login</h2>
<form method="post" action="">
{% csrf_token %}
<div class="item">
{{form.username}}
{{form.username.errors.0}}
<label for="">用户名</label>
</div>
<div class="item">
{{form.password}}
{{form.password.errors.0}}
<label for="">密码</label>
</div>
<button class="btn">submit
<span></span>
<span></span>
<span></span>
<span></span>
</button>
</form>
</div>
</body>
</html>
中间件
意味着要执行视图函数中的代码都需先要执行这个中间件。这里设置的功能意味着只有登录进去才能访问列表
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
class M1(MiddlewareMixin):
''' 中间件 '''
def process_request(self, request):
if request.path_info == "/login/": # 排除这个url
return
info_dict = request.session.get('info')
if info_dict:
return
return redirect('/login/')
注销
清空url中储存的session参数。并返回登录界面
def logout(request):
"""注销"""
request.session.clear()
return redirect('/login/')
细节
request中含有一些参数可以使用
个人理解:在正确登录时,会在request中的session中创建一个值储存起来,并随机生成一个字符串。这个储存的值会伴随着整个程序的运行。这个值可以用于中间件,判断是否成功登录,如果值为空,则其他列表页面不能访问。这个值也还可以用于传递一些信息。最后也可以通过request.session.clear()来清除这个值,即注销登录功能。