小白个人博客----登录功能实现

登录:输入刚才注册的信息, 去数据库验证

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())

posted @ 2018-09-28 15:12  986428528  阅读(997)  评论(0)    收藏  举报