登录验证码实现
只实现验证码功能,没有样式。后续验证码替换可改为ajax请求,实现局部刷新。
路由代码:
from django.contrib import adminfrom django.urls import pathfrom app01 import viewsurlpatterns = [path('admin/', admin.site.urls),path('login/', views.login), #登录接口path('update_yanzheng/', views.update_yanzheng),#验证码替换]
视图代码:
# 验证码的实现from PIL import Image, ImageDraw, ImageFontimport randomfrom io import BytesIO, StringIOfrom django.shortcuts import HttpResponse,render,redirect# 获取随机的样式颜色def get_random():return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)def get_code(request):img_obj = Image.new('RGB', (350, 30), get_random()) # 生成图片对象img_draw = ImageDraw.Draw(img_obj) # 生成了一个画笔对象img_font = ImageFont.truetype('static/font/sylfaen.ttf', 30) # 字体样式# 随机码的获取:code = ''for i in range(5):upper_str = chr(random.randint(65, 90)) # ascii码 大写字母lower_str = chr(random.randint(97, 122)) # ascii码 小写字母random_int = str(random.randint(0, 9))tmp = random.choice([upper_str, lower_str, random_int]) # 随机取值img_draw.text((i * 60 + 60, 0), tmp, get_random(), img_font) # 文字展示到图片上code += tmp # 一次结果print(code)request.session['code'] = code # 存储io_obj = BytesIO() # 内存内存储,读取img_obj.save('static/img/yanzheng.png', 'png') # 保存,并选定格式return codecode = Nonedef login(request):global codeif request.method == 'GET':code = get_code(request)return render(request, 'login.html')else:user = request.POST.get('user')pwd = request.POST.get('pwd')yanzheng = request.POST.get('yanzheng')print(user,pwd,yanzheng)if user=='root' and pwd=='root' and yanzheng==code:return redirect('')else:return render(request, 'login.html','登录失败')def update_yanzheng(request):global codecode = get_code(request)return render(request, 'login.html')
前端超文本内容:
下面展示一些内联代码片
。
<form method="POST" action="/login"><p>用户名:<input type="text" name="user"></p><p>密码:<input type="text" name="pwd"></p><p>验证码:<input type="text" name="yanzheng"><img src="/static/img/yanzheng.png"><a href="/update_yanzheng">看不清</a></p><input type="submit" value="登录"></form>
结果展示: