登录验证+验证码

验证码示例:

我使用的是sqlite3数据库存储数据

urls.py

from django.contrib import admin
from django.urls import path

from blog import views
urlpatterns = [
    path('admin/', admin.site.urls),
    #使用FBV来写的格式
    path('login/', views.Login.as_view()),
    path('get_valid_pic/', views.get_valid_pic),
    path('index/', views.index),
]

views.py

from django.shortcuts import render,redirect,HttpResponse
from django.http import JsonResponse

# Create your views here.

from django.views import View
from django.contrib import auth
from django.contrib.auth.decorators import login_required

class Login(View):
    def get(self,request):
        return render(request,'login.html')
    def post(self,request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        valid_code = request.POST.get('valid_code')
        valid_str = request.session.get('valid_str')
        #以后向ajax中传数据最好都使用一个字典
        res = {'state':False,'msg':None}
        if valid_code.upper() == valid_str.upper():
            #用户认证
            user = auth.authenticate(username=username,password=password)
            auth.login(request,user)
            if user:
                res['state'] = True
            else:
                res['msg'] = '用户名密码错误!'
        else:
            res['msg'] = '验证码错误'

        return JsonResponse(res)

def get_valid_pic(request):
    from PIL import Image,ImageDraw,ImageFont
    import random
    #生乘随机的RGB
    def random_color():
        return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
    #生成随机背景色  对象
    image = Image.new("RGB",(270,37),random_color())

    #给图片添加内容
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype("static/fontAwesome/fonts/song.ttf", 28)
    temp = []
    for i in range(5):
        random_low = chr(random.randint(97,122))
        random_upper = chr(random.randint(65,90))
        random_digit = str(random.randint(0,9))
        random_choose = random.choice([random_low,random_upper,random_digit])
        draw.text((40+40*i,0),random_choose,random_color(),font=font)
        temp.append(random_choose)


    # 在内存中生成图片
    from io import BytesIO
    f = BytesIO()
    image.save(f, "png")
    data = f.getvalue()
    f.close()

    valid_str = ''.join(temp)

    request.session['valid_str'] = valid_str

    return HttpResponse(data)


#这个装饰器实现的功能是,之前登录过index的可以直接登录,没登录过的就跳转到login页面
#注意要在settings.py中       LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由
@login_required
def index(request):
    return render(request,'index.html')

login.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录界面</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'fontAwesome/css/font-awesome.min.css' %}">
    <link rel="stylesheet" href="{% static 'sweetalert/sweetalert.css' %}">
    <style>
        .container {
            margin-top: 100px;
        }
    </style>
</head>
<body>

<div class="container">
    <div class="row">
        <form action="" class="col-md-6 col-md-offset-3">
            <div class="form-group">
                <label for="username">用户名</label>
                <input type="text" class="form-control" id="username" placeholder="username">
            </div>
            <div class="form-group">
                <label for="password">密码</label>
                <input type="password" class="form-control" id="password" placeholder="password">
            </div>
            <label for="valid_code">验证码</label>
            <div class="row form-group">
                <div class="col-md-6">
                    <input type="text" class="form-control" id="valid_code">
                </div>
                <div class="col-md-6">
                    <img width="270px" height="37px" src="/get_valid_pic/" alt="">
                </div>
            </div>
                <input type="button" class="btn btn-default" value="登录" id="btn">
            <span style="margin-left: 20px;color: red" class="error"></span>
        </form>
    </div>
</div>

<script src="{% static 'jquery-3.2.1.min.js' %}"></script>
<script src="{% static 'setupajax.js' %}"></script>
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
<script src="{% static 'sweetalert/sweetalert.min.js' %}"></script>
<script>
{#    使用AJAX给登录按钮绑定事件#}
    $("#btn").on("click",function () {
        $.ajax({
            url:'',
            type:"POST",
            data:{
                username:$("#username").val(),
                password:$("#password").val(),
                valid_code:$("#valid_code").val()
            },
            success:function (arg) {
                if (arg.state){
                    location.href="/index/"
                }
                else{
                    $('.error').text(arg.msg)
                }
            }
        })
    })
</script>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'fontAwesome/css/font-awesome.min.css' %}">
    <link rel="stylesheet" href="{% static 'sweetalert/sweetalert.css' %}">
</head>
<body>

<h1>hello,{{ request.user.username }}</h1>

<script src="{% static 'jquery-3.2.1.min.js' %}"></script>
<script src="{% static 'setupajax.js' %}"></script>
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
<script src="{% static 'sweetalert/sweetalert.min.js' %}"></script>
</body>
</html>

注意:

  在使用auth用户认证的时候,要创建一个超级用户

点击验证码刷新功能

<script>    
    {#    验证码刷新#}
    //绑定要刷新的对象
    $("#valid_img").on("click",function () {
        //先把js对象转化成dom对象,在后面加上?就相当于在此访问
        $(this)[0].src+="?";
    })
</script>

 

posted @ 2020-04-15 11:50  my_Sunday  阅读(1138)  评论(0编辑  收藏  举报