小白个人博客----登录功能实现
登录:输入刚才注册的信息, 去数据库验证
view:
添加了验证码模块
from django.shortcuts import render, redirect, HttpResponse from ..forms.validateAccounty import * from repository import models import json from io import BytesIO from utils.check_code import create_validate_code def login(request): if request.method == "GET": return render(request, "login.html") elif request.method == "POST": result = {'status': False, 'message': None, 'data': None} form_obj = LoginForm(request=request,data=request.POST) if form_obj.is_valid(): username=form_obj.cleaned_data.get("username") password=form_obj.cleaned_data.get("password") user_info=models.UserInfo.objects.filter( #根据用户的输入到数据库取信息 username=username, password=password ).values("uid","nickname","username", "avatar",'blog__bid',"blog__site").first() print("user_info",user_info) if not user_info: #没有此用户名或密码 result["message"]="用户名或密码错误" else: result["status"]=True request.session["user_info"]=user_info request.session["user_login"]=username #登录成功将用户信息写入session # print(request.session["user_login"]) if form_obj.cleaned_data.get('rmb'): request.session.set_expiry(60*60*24*30) #设置session有效期 return HttpResponse(json.dumps(result)) else: print("form_obj_errors",form_obj.errors) if "check_code" in form_obj.errors: result["message"]="验证码错误或者过期" else: result["message"]='用户名或密码错误' return HttpResponse(json.dumps(result))
html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css"> <link rel="stylesheet" href="/static/plugins/font-awesome/css/font-awesome.css"> <link rel="stylesheet" href="/static/css/row-avatar.css"> <script type="text/javascript" src="/static/js/jquery-1.12.4.js"></script> <script type="text/javascript" src="/static/plugins/bootstrap/js/bootstrap.js"></script> </head> <body> <div class="login"> <div style="font-size: 25px; width:700px;font-weight: bold;text-align: center;"> 用户登陆 </div> <form class="form-horizontal" id="fm" method="POST" action="/login.html"> {% csrf_token %} <div class="form-group"> <label for="username" class="col-sm-2 control-label">用户名</label> <div class="col-sm-4"> <input type="text" class="form-control" name="username" id="username" placeholder="请输入用户名"> </div> </div> <div class="form-group"> <label for="password" class="col-sm-2 control-label">密码</label> <div class="col-sm-4"> <input type="password" class="form-control" name="password" id="password" placeholder="请输入密码"> </div> </div> <div class="form-group"> <label for="password" class="col-sm-2 control-label">验证码</label> <div class="row"> <div class="col-sm-1"> <input type="text" class="form-control" name="check_code" id="check_code" placeholder="请输入验证码"> </div> <div class="col-sm-5"> <img id="check_code_img" src="/check_code.html"> #验证码 </div> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <div class="checkbox"> <label> <input type="checkbox" name="rmb" value="1"> 一个月内免登录 </label> </div> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="button" id="submit" class="btn btn-default">登录</button> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label"></label> <div class="col-sm-4"> <div class="alert alert-danger hide"> <span style="padding: 0 5px 0 5px;display: inline-block;font-size: 14px"> <i class="fa fa-minus-circle" aria-hidden="true"></i> </span> <span id="error_msg" style="font-size: 12px;"></span> #打印错误信息 </div> </div> </div> </form> </div> <script src="/static/js/jquery-1.12.4.js"></script> <script> $(function () { bindLogin(); }); function bindLogin() { var $msg = $("#error_msg"); $msg.parent().addClass("hide"); $("#submit").click(function () { $.ajax({ url: "/login.html", type: "POST", data: $("#fm").serialize(), dataType: "JSON", success: function (arg) { if (arg.status) { window.location.href = '/'; } else { $msg.parent().removeClass("hide"); $msg.text(arg.message); var $img = $("#check_code_img")[0];#出错后,更新验证码 $img.src = $img.src + '?'; #再次访问src $("#password,#check_code").val(''); #清空原来的密码,验证码 } } }) }) } </script> </body> </html>
form:
from django.core.exceptions import ValidationError from django.forms import Form from django.forms import fields from django.forms import widgets from .base import Base
class LoginForm(Form): #传入request, 其他的父类去处理
def __init__(self,request,*args,**kwargs):
self.request = request
super(LoginForm,self).__init__(*args,**kwargs)
username = fields.CharField(
min_length=3,
max_length=20,
required=True,
error_messages={"required": "用户名不能为空", "max_length": "太长", "min_length": "太短了"}
)
password = fields.RegexField(
'^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$\%\^\&\*\(\)])[0-9a-zA-Z!@#$\%\^\&\*\(\)]{8,32}$',
min_length=6,
max_length=32,
error_messages={
'required': "密码不能为空",
"invalid": "密码必须包含数字,字母、特殊字符",
"min_length": "太短了",
"max_length": "太长了", }
)
rmb = fields.CharField(required=False)
check_code = fields.CharField(required=True, error_messages={"required": "验证码不能为空"})
def clean_check_code(self):
if self.request.session.get("CheckCode").upper() != self.request.POST.get("check_code").upper():
raise ValidationError(message="验证码错误",code="invalid")
def check_code(request): stream = BytesIO() img, code = create_validate_code() #print(code) img.save(stream, 'PNG') request.session['CheckCode'] = code #生成后写入session里面 return HttpResponse(stream.getvalue())




浙公网安备 33010602011771号