from django.shortcuts import render, redirect, HttpResponse from django import forms from app import models from app.utils.bootstrap import BootSF from app.utils.encrypt import md5 from app.utils.code import check_code class LoginForm(BootSF): 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): password = self.cleaned_data.get('password') return md5(password) def login(request): """登录页面""" form = LoginForm() if request.method == "GET": title = "登录" return render(request, 'login.html', {'form': form, 'title': title}) form = LoginForm(data=request.POST) if form.is_valid(): # {'username':'a','password':123} # print(form.cleaned_data) # 验证码的校验 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(**form.cleaned_data).first() if not admin_object: form.add_error( "password", '用户名或者密码错误' ) return render(request, 'login.html', {'form': form}) # 验证通过 网站生成随机生成字符串,写到用户浏览器的cookie中然后写入session中 # 也可以写成字典 {“name”admin_object.username:“password”:admin_object.password} # 保存cookie到客户端 request.set.cookie['info']=admin_object.username request.session["info"] = admin_object.username # 七天免密登录 request.session.set_expiry(60 * 60 * 24 * 7) return redirect('/admin/list/') # return HttpResponse("123456") # 数据库处理 return render(request, 'login.html', {'form': form}) from io import BytesIO def image_code(request): """验证码图片""" img, code_str = check_code() # 写入自己的session中 request.session['image_code'] = code_str # 给验证码设置60s超时 request.session.set_expiry(60) # print(code_str) stream = BytesIO() img.save(stream, "png") # with open('code.png', 'wb') as f: # img.save(f, format='png') return HttpResponse(stream.getvalue()) def logout(request): """注销""" # 把你当前的用户取消掉 request.session.clear() return redirect('/login/')
<div class="account"> <h2>用户登录</h2> <form method="post" novalidate> {% csrf_token %} <div class="form-group"> <label>用户名</label> {{ form.username }} <span style="color:red;">{{form.username.errors.0}}</span> </div> <div class="form-group"> <label>密码</label> {{form.password}} <span style="color:red;">{{form.password.errors.0}}</span> </div> <div class = "form-group"> <label >图片验证码</label> <div class="row"> <div class="col-xs-7"> {{form.code}} <span style="color:red;">{{form.code.errors.0}}</span> </div> <div class="col-xs-5"> <img id="image_code" src="/image/code/" style="width:125px;"> </div> </div> </div> <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> <input type="submit" value="登录" class="btn btn-primary"> </form>
#model模版中 class Admin(models.Model): """管理员管理""" username = models.CharField(verbose_name='用户名', primary_key=True, max_length=32, blank=False, null=False) password = models.CharField(verbose_name='密码', max_length=32, blank=False, null=False) def __str__(self): return self.username # url模板中 path('login/', account.login), path('logout/', account.logout), path('image/code/', account.image_code),
验证码代码会在以后发布