|
|
|
|
from django.shortcuts import render, HttpResponse, redirect
|
|
|
|
|
from django import forms
|
|
|
|
|
from io import BytesIO
|
|
|
|
|
|
|
|
|
|
from app01.utils.code import check_code
|
|
|
|
|
from app01 import models
|
|
|
|
|
from app01.utils.bootstrap import BootStrapForm
|
|
|
|
|
from app01.utils.encrypt import md5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LoginForm(BootStrapForm):
|
|
|
|
|
username = forms.CharField(
|
|
|
|
|
label="用户名",
|
|
|
|
|
widget=forms.TextInput,
|
|
|
|
|
required=True
|
|
|
|
|
)
|
|
|
|
|
password = forms.CharField(
|
|
|
|
|
label="密码",
|
|
|
|
|
widget=forms.PasswordInput(render_value=True),
|
|
|
|
|
required=True
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
code = forms.CharField(
|
|
|
|
|
label="验证码",
|
|
|
|
|
widget=forms.TextInput,
|
|
|
|
|
required=True
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def clean_password(self):
|
|
|
|
|
pwd = self.cleaned_data.get("password")
|
|
|
|
|
return md5(pwd)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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():
|
|
|
|
|
# 验证成功,获取到的用户名和密码
|
|
|
|
|
# {'username': 'wupeiqi', 'password': '123',"code":123}
|
|
|
|
|
# {'username': 'wupeiqi', 'password': '5e5c3bad7eb35cba3638e145c830c35f',"code":xxx}
|
|
|
|
|
|
|
|
|
|
# 验证码的校验
|
|
|
|
|
user_input_code = form.cleaned_data.pop('code')
|
|
|
|
|
code = request.session.get('image_code', "")
|
|
|
|
|
if code.upper() != user_input_code.upper():
|
|
|
|
|
form.add_error("code", "验证码错误")
|
|
|
|
|
return render(request, 'login.html', {'form': form})
|
|
|
|
|
|
|
|
|
|
# 去数据库校验用户名和密码是否正确,获取用户对象、None
|
|
|
|
|
# admin_object = models.Admin.objects.filter(username=xxx, password=xxx).first()
|
|
|
|
|
admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
|
|
|
|
|
if not admin_object:
|
|
|
|
|
form.add_error("password", "用户名或密码错误")
|
|
|
|
|
# form.add_error("username", "用户名或密码错误")
|
|
|
|
|
return render(request, 'login.html', {'form': form})
|
|
|
|
|
|
|
|
|
|
# 用户名和密码正确
|
|
|
|
|
# 网站生成随机字符串; 写到用户浏览器的cookie中;在写入到session中;
|
|
|
|
|
request.session["info"] = {'id': admin_object.id, 'name': admin_object.username}
|
|
|
|
|
# session可以保存7天
|
|
|
|
|
request.session.set_expiry(60 * 60 * 24 * 7)
|
|
|
|
|
|
|
|
|
|
return redirect("/admin/list/")
|
|
|
|
|
|
|
|
|
|
return render(request, 'login.html', {'form': form})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def image_code(request):
|
|
|
|
|
""" 生成图片验证码 """
|
|
|
|
|
|
|
|
|
|
# 调用pillow函数,生成图片
|
|
|
|
|
img, code_string = check_code()
|
|
|
|
|
|
|
|
|
|
# 写入到自己的session中(以便于后续获取验证码再进行校验)
|
|
|
|
|
request.session['image_code'] = code_string
|
|
|
|
|
# 给Session设置60s超时
|
|
|
|
|
request.session.set_expiry(60)
|
|
|
|
|
|
|
|
|
|
stream = BytesIO()
|
|
|
|
|
img.save(stream, 'png')
|
|
|
|
|
return HttpResponse(stream.getvalue())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def logout(request):
|
|
|
|
|
""" 注销 """
|
|
|
|
|
|
|
|
|
|
request.session.clear()
|
|
|
|
|
|
|
|
|
|
return redirect('/login/')
|