zoukankan      html  css  js  c++  java
  • 登录验证+验证码

    验证码示例:

    我使用的是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>
  • 相关阅读:
    C# 开发规范
    C# 调用webserver 出现:未能从程序集“jgd3jufm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型
    C# 组装XML传给webserver+XML 返回获取多个xml,根据多个XML 返回dataset类型
    linux下搭建git服务器
    Linux整合Apache和SVN
    JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
    比尔盖茨的十句忠告
    Spring核心接口之InitializingBean
    mongodb安装和配置
    redis主从配置
  • 原文地址:https://www.cnblogs.com/liujie12/p/12704256.html
Copyright © 2011-2022 走看看