登录功能

思路分析

登录页面,我们还是采用ajax的方式提交用户数据

唯一需要学习的是如何制作图片验证码!

具体的登录页面效果图如下:

登录功能

如何制作图片验证码

推导步骤1:在img标签的src属性里放上验证码的请求路径

补充1.img的src属性:
    1.图片路径
    2.url
    3.图片的二进制数据
补充2:字体样式
    我们计算机上之所以可以输出各种各样的字体样式,其内部其实对应的是一个个以.ttf结尾的文件

由于img的src属性里可以放图片的二进制数据,因此我们可以在src里放上图片的请求路径,返回的是一个图片的二进制数据

<img src="/get_code/" alt width="350" height="35">

&#x8BE5;&#x89C6;&#x56FE;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x56FE;&#x7247;&#x7684;&#x4E8C;&#x8FDB;&#x5236;&#x6570;&#x636E;&#xFF0C;&#x56FE;&#x7247;&#x662F;&#x672C;&#x5730;&#x5DF2;&#x6709;&#x7684;&#x56FE;&#x7247;&#x8DEF;&#x5F84;
def get_code(request):
    with open ('static/img/default.png','rb') as f:
        data = f.read()
    return HttpResponse(data)

字体样式网站

推导步骤2:利用pillow模块动态产生图片

"""
&#x56FE;&#x7247;&#x76F8;&#x5173;&#x7684;&#x6A21;&#x5757;&#xFF1A;
        pip3 install pillow
&#x5BFC;&#x5165;&#xFF1A;from PIL import Image,ImageDraw,ImageFont
Image&#xFF1A;&#x751F;&#x6210;&#x56FE;&#x7247;
ImageDraw&#xFF1A;&#x80FD;&#x591F;&#x5728;&#x56FE;&#x7247;&#x4E0A;&#x4E71;&#x6D82;&#x4E71;&#x753B;
ImageFont&#xFF1A;&#x63A7;&#x5236;&#x5B57;&#x4F53;&#x6837;&#x5F0F;
"""
from PIL import Image,ImageDraw,ImageFont
import random

def get_random():
    return random.randint(0,255),random.randint(0,255),random.randint(0,255),

def get_code(request):
    1.&#x5148;&#x4EA7;&#x751F;&#x4E00;&#x4E2A;&#x56FE;&#x7247;&#xFF0C;new&#x65B9;&#x6CD5;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x56FA;&#x5B9A;&#x6A21;&#x5F0F;RGB&#x683C;&#x5F0F;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x662F;&#x56FE;&#x7247;&#x5927;&#x5C0F;(&#x5BBD;&#xFF0C;&#x9AD8;)&#xFF0C;&#x7B2C;&#x4E09;&#x4E2A;&#x662F;&#x56FE;&#x7247;&#x989C;&#x8272;(&#x53EF;&#x4EE5;&#x653E;rgb&#x6A21;&#x5F0F;&#x7684;&#x989C;&#x8272;)
    # image_obj = Image.new('RGB',(350,35),'green') # &#x56FA;&#x5B9A;&#x989C;&#x8272;
    # image_obj = Image.new('RGB',(350,35),(23,43,53)) # &#x53D8;&#x5F62;1
    image_obj = Image.new('RGB', (350, 35), get_random()) # &#x53D8;&#x5F62;2
    2.&#x5C06;&#x4EA7;&#x751F;&#x7684;&#x56FE;&#x7247;&#x5B58;&#x8D77;&#x6765;&#xFF0C;&#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x8BE5;&#x56FE;&#x7247;&#x6709;&#x4E00;&#x4E2A;save&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x5B58;&#x50A8;&#x56FE;&#x7247;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x6587;&#x4EF6;&#x53E5;&#x67C4;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x662F;&#x5B58;&#x50A8;&#x56FE;&#x7247;&#x683C;&#x5F0F;
    with open('xxx.png','wb') as f:
        image_obj.save(f,'png')

    3.&#x518D;&#x5C06;&#x56FE;&#x7247;&#x4EE5;&#x4E8C;&#x8FDB;&#x5236;&#x5F62;&#x5F0F;&#x8BFB;&#x51FA;&#x6765;&#xFF0C;&#x8FD4;&#x56DE;&#x7ED9;img&#x6807;&#x7B7E;&#x7684;src&#x5C5E;&#x6027;
    with open('xxx.png','rb') as f:
        data = f.read()
    return HttpResponse(data)

上述方法:会进行频繁的文件存储IO操作,效率比较低下,步骤4利用内存管理器模块优化!

推导步骤4:利用内存管理器模块优化

"""
&#x5BFC;&#x5165;&#x5185;&#x5B58;&#x7BA1;&#x7406;&#x5668;&#x6A21;&#x5757;&#xFF1A;from io import BytesIO,StringIO
BytesIO&#xFF1A;&#x529F;&#x80FD;&#x4E34;&#x65F6;&#x5E2E;&#x60A8;&#x5B58;&#x50A8;&#x6570;&#x636E;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x6570;&#x636E;&#x662F;&#x4E8C;&#x8FDB;&#x5236;
StringIO&#xFF1A;&#x529F;&#x80FD;&#x4E34;&#x65F6;&#x5E2E;&#x60A8;&#x5B58;&#x50A8;&#x6570;&#x636E;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x6570;&#x636E;&#x662F;&#x5B57;&#x7B26;&#x4E32;
"""
def get_code(request):

    # 1.&#x540C;&#x6837;&#x5148;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x56FE;&#x7247;&#x5BF9;&#x8C61;
    image_obj = Image.new('RGB', (350, 35), get_random())
    # 2.&#x8FD9;&#x91CC;&#x518D;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x5185;&#x5B58;&#x7BA1;&#x7406;&#x5668;&#x5BF9;&#x8C61;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x770B;&#x6210;&#x662F;f&#x6587;&#x4EF6;&#x53E5;&#x67C4;
    io_obj = BytesIO()
    # 3.&#x5C06;&#x56FE;&#x7247;&#x4FDD;&#x5B58;&#x5230;&#x6587;&#x4EF6;&#x7BA1;&#x7406;&#x5668;&#x5BF9;&#x8C61;&#x91CC;
    image_obj.save(io_obj,'png')
    # 4.&#x628A;&#x56FE;&#x7247;&#x4ECE;&#x6587;&#x4EF6;&#x7BA1;&#x7406;&#x5668;&#x5BF9;&#x8C61;&#x91CC;&#x53D6;&#x51FA;&#x6765;&#xFF0C;&#x7528;getvalue()&#x65B9;&#x6CD5;
    return HttpResponse(io_obj.getvalue())

最终步骤:写图片验证码

def get_code(request):
    # 1.&#x540C;&#x6837;&#x5148;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x56FE;&#x7247;&#x5BF9;&#x8C61;
    image_obj = Image.new('RGB', (350, 35), get_random())
    # 2.&#x5728;&#x56FE;&#x7247;&#x4E0A;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x753B;&#x7B14;&#x5BF9;&#x8C61;
    img_draw = ImageDraw.Draw(image_obj)
    # 3.&#x8BBE;&#x7F6E;&#x5B57;&#x4F53;&#x6837;&#x5F0F;&#xFF0C;truetype()&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x5B57;&#x4F53;&#x6837;&#x5F0F;&#x8DEF;&#x5F84;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x662F;&#x5B57;&#x4F53;&#x5927;&#x5C0F;
    img_font = ImageFont.truetype('static/font/222.ttf',30)

    # 4.&#x968F;&#x673A;&#x751F;&#x6210;&#x9A8C;&#x8BC1;&#x7801;&#xFF0C;&#x4E94;&#x4F4D;&#xFF0C;&#x5927;&#x5C0F;&#x5199;&#x5B57;&#x6BCD;&#x3001;&#x6570;&#x5B57;
    code = ''
    for i in range(5):
        random_upper = chr(random.randint(65,90)) # 65-90&#x7684;&#x6570;&#x5B57;&#x4F7F;&#x7528;chr()&#x51FD;&#x6570;&#x5BF9;&#x5E94;&#x8F6C;&#x6210;&#x5927;&#x5199;&#x5B57;&#x6BCD;
        random_lower = chr(random.randint(97,122)) # 97-122&#x7684;&#x6570;&#x5B57;&#x4F7F;&#x7528;chr()&#x51FD;&#x6570;&#x5BF9;&#x5E94;&#x8F6C;&#x6210;&#x5C0F;&#x5199;&#x5B57;&#x6BCD;
        random_int = str(random.randint(0,9))

        # &#x4ECE;&#x4E0A;&#x9762;&#x4E09;&#x79CD;&#x968F;&#x673A;&#x9009;&#x62E9;&#x4E00;&#x79CD;
        tmp = random.choice([random_int,random_lower,random_upper])
        # &#x5C06;&#x4EA7;&#x751F;&#x7684;&#x968F;&#x673A;&#x5B57;&#x7B26;&#x4E32;&#x5199;&#x5230;&#x56FE;&#x7247;&#x4E0A;
"""
        text()&#x65B9;&#x6CD5;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x5B57;&#x7B26;&#x4E32;&#x5728;&#x56FE;&#x7247;&#x4E0A;&#x7684;&#x5750;&#x6807;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x662F;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;
        &#x7B2C;&#x4E09;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x989C;&#x8272;&#xFF0C;&#x7B2C;&#x56DB;&#x4E2A;&#x5B57;&#x4F53;&#x6837;&#x5F0F;&#x548C;&#x5927;&#x5C0F;
"""
        img_draw.text((i*60,0),tmp,get_random(),img_font)
        code += tmp
    print(code)
    # 5.&#x5C06;&#x751F;&#x6210;&#x7684;&#x968F;&#x673A;&#x9A8C;&#x8BC1;&#x7801;&#x4FDD;&#x5B58;&#x8D77;&#x6765;&#xFF0C;&#x56E0;&#x4E3A;&#x5728;&#x767B;&#x5F55;&#x7684;&#x89C6;&#x56FE;&#x51FD;&#x6570;&#x9700;&#x8981;&#x7528;&#x5230;&#xFF0C;&#x8FDB;&#x884C;&#x6BD4;&#x5BF9;
    request.session['code'] = code
    # 6.&#x518D;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x5185;&#x5B58;&#x7BA1;&#x7406;&#x5668;&#x5BF9;&#x8C61;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x770B;&#x6210;&#x662F;f&#x6587;&#x4EF6;&#x53E5;&#x67C4;
    io_obj = BytesIO()
    # 7.&#x5C06;&#x56FE;&#x7247;&#x4FDD;&#x5B58;&#x5230;&#x6587;&#x4EF6;&#x7BA1;&#x7406;&#x5668;&#x5BF9;&#x8C61;&#x91CC;
    image_obj.save(io_obj,'png')
    # 8.&#x628A;&#x56FE;&#x7247;&#x4ECE;&#x6587;&#x4EF6;&#x7BA1;&#x7406;&#x5668;&#x5BF9;&#x8C61;&#x91CC;&#x53D6;&#x51FA;&#x6765;&#xFF0C;&#x7528;getvalue()&#x65B9;&#x6CD5;
    return HttpResponse(io_obj.getvalue())

补充

如何让用户一点验证码图片就刷新验证码

<img src="/get_code/" alt width="350" height="35" id="img">

<script>
    $('#img').click(function (){
        let OldUrl = $(this).attr('src')
        $(this).attr('src',OldUrl += '?')
    })
</script>

向后端提交用户登录数据

前端:

    // &#x70B9;&#x51FB;&#x767B;&#x5F55;&#x6309;&#x94AE;&#x5411;&#x540E;&#x7AEF;&#x53D1;&#x9001;ajax&#x8BF7;&#x6C42;
    $('#commit').click(function (){
        $.ajax({
            type:'post',
            url:'',
            data:{
                'username': $('#id_username').val(),
                'password': $('#id_password').val(),
                'code': $('#id_code').val(),
                'csrfmiddlewaretoken': '{{ csrf_token }}',
            },
            success:function (args){
                if (args.code==1000){
                    window.location.href = args.url
                }else {
                    $('#error').text(args.msg)
                }
            }
        })
    })

后端:

&#x4E8C;&#x3001;&#x767B;&#x5F55;&#x9875;&#x9762;
def login(request):
    # 1.&#x5224;&#x65AD;&#x662F;&#x5426;&#x4E3A;ajax&#x8BF7;&#x6C42;
    if request.method == 'POST':
        back_dic = {'code':1000,'msg':''}
        # 2.&#x83B7;&#x53D6;&#x7528;&#x6237;&#x63D0;&#x4EA4;&#x7684;&#x767B;&#x5F55;&#x6570;&#x636E;
        username = request.POST.get('username')
        password = request.POST.get('password')
        code = request.POST.get('code')
        # 3.&#x5224;&#x65AD;&#x9A8C;&#x8BC1;&#x7801;&#x662F;&#x5426;&#x6B63;&#x786E;
        if code.upper() == request.session['code'].upper():
            # 4.&#x5229;&#x7528;auth&#x6A21;&#x5757;&#x5224;&#x65AD;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#x662F;&#x5426;&#x6B63;&#x786E;
            user_obj = auth.authenticate(request,username=username,password=password)
            if user_obj:
                # 5.&#x6B63;&#x786E;&#x5219;&#x4FDD;&#x5B58;&#x7528;&#x6237;&#x72B6;&#x6001;
                auth.login(request,user_obj)
                # 6.&#x8DF3;&#x8F6C;&#x5230;&#x4E3B;&#x9875;
                back_dic['url'] = '/home/'
            else:
                # 7.&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x5C55;&#x793A;
                back_dic['code'] = 1001
                back_dic['msg'] = '&#x7528;&#x6237;&#x540D;&#x6216;&#x8005;&#x5BC6;&#x7801;&#x4E0D;&#x6B63;&#x786E;'
        else:
            back_dic['code'] = 1002
            back_dic['msg'] = '&#x9A8C;&#x8BC1;&#x7801;&#x4E0D;&#x6B63;&#x786E;'
        return JsonResponse(back_dic)
    return render(request,'login.html',locals())

Original: https://www.cnblogs.com/suncolor/p/16757628.html
Author: 等日落
Title: 登录功能

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/808915/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球