驗證碼 登入中應用
阿新 • • 發佈:2018-11-06
url路由:
#驗證碼
url(r'^v_code/$', views.v_code,name='v_code'),
sesting配置:
#許可權設定
# 1. session設定
PERMISSION_SESSION_KEY = 'permissions' #許可權資訊
MENU_SESSION_KEY = 'menus' #選單資訊
#2. 白名單設定
WHITE_URL_LIST = [
r'^/login/$',
r'^/logout/$',
r'^/reg/$',
r'^/admin/.*', #這個後面用正則 .* 表示
r'^/v_code/.*', #驗證碼 --------------------------------- 此處新增
]
試圖函式程式碼:
from PIL import Image,ImageDraw,ImageFont #驗證碼
import random #隨機數
#顏色隨機
def random_color():
return random.randint(0,255),random.randint(0,255),random.randint(0,255)
#驗證碼
def v_code(request):
# 建立一個隨機顏色的圖片物件
img_obj=Image.new('RGB',(250,35),random_color())
# 在該圖片物件上生成一個畫筆物件
draw_obj=ImageDraw.Draw(img_obj)
# 載入一個字型物件
font_obj = ImageFont.truetype('static/font/kumo.ttf', 28)
#建立隨機數列表
temp=[]
for i in range(5):
l=chr(random.randint(97,122)) #小寫字母
b=chr(random.randint(65,90)) #大寫字母
n=str(random.randint(0,9))
# 從上面三個隨機選一個
t=random.choice([l,b,n])
temp.append(t)
#建立驗證碼
draw_obj.text((i*45+35,0),t,fill=random_color(),font=font_obj)
#加干擾線
width=250 #圖片寬度(防止越界)
height=35
for i in range(5):
#座標
x1 = random.randint(0, width)
x2 = random.randint(0, width)
y1 = random.randint(0, height)
y2 = random.randint(0, height)
#新增 驗證碼中
draw_obj.line((x1,y1,x2,y2),fill=random_color())
#記錄到session中 變成字串形式 upper就是大小寫都可以
request.session['v_code']=''.join(temp).upper()
# 直接在記憶體中儲存圖片替代io操作
from io import BytesIO
f1=BytesIO()
img_obj.save(f1,format='PNG')
img_data=f1.getvalue()
return HttpResponse(img_data,content_type='imsge/png')
# 登入介面
def login(request):
ret=''
if request.method=='POST':
username=request.POST.get('username')
password = request.POST.get('password')
v_code=request.POST.get('v_code','').upper() #判斷驗證碼 ----------------------------------此處
if v_code==request.session.get('v_code'):
# 判斷密碼對不對
obj=auth.authenticate(request,username=username,password=password)
if obj:
# 記錄登入狀態
auth.login(request,obj)
ret=init_permission(request,obj)
if ret:
return ret
return redirect(reverse('page'))
ret='使用者名稱或密碼錯誤'
else:
ret ='驗證碼錯誤'
return render(request,'login.html',{'ret':ret})
html中應用及js程式碼:
<div class="login-center clearfix">
<div class="login-center-img"><img src="{% static 'imgs/password.png' %}"></div>
<div class="login-center-input">
<input type="text" name="v_code" value="" placeholder="請輸入驗證碼" onfocus="this.placeholder=''"
onblur="this.placeholder='請輸入驗證碼'">
<div class="login-center-input-text">驗證碼</div>
</div>
</div>
#此處為新增記憶體快取圖片
<div style="text-align: center">
<img src="{% url 'v_code' %}" alt="" id="v_code">
</div>
#此處為js 程式碼 圖片點選每次重新整理
<script>
img=document.getElementById('v_code');
img.onclick=function () {
img.src +='?'
}
</script>