Django 로그 인 랜 덤 인증 코드 구현 예제 코드
1.랜 덤 인증 코드 생 성
#_*_coding:utf-8_*_
from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random
import math, string
# ,
font_path = '/Library/Fonts/Arial.ttf'
#font_path = '/Library/Fonts/Hanzipen.ttc'
#
number = 4
#
size = (100,30)
# ,
bgcolor = (255,255,255)
# ,
fontcolor = (0,0,255)
# 。
linecolor = (255,0,0)
#
draw_line = True
#
line_number = (1,5)
def gen_text():
source = list(string.ascii_letters)
for index in range(0,10):
source.append(str(index))
return ''.join(random.sample(source,number))#number
#
def gene_line(draw,width,height):
begin = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.line([begin, end], fill = linecolor)
def gene_code(save_path,filename):
width,height = size #
image = Image.new('RGBA',(width,height),bgcolor) #
font = ImageFont.truetype(font_path,25) #
#font = ImageFont.truetype(25) #
draw = ImageDraw.Draw(image) #
#text = " " #
text = gen_text() #
print(text)
font_width, font_height = font.getsize(text)
draw.text(((width - font_width) / number, (height - font_height) / number),text,\
font= font,fill=fontcolor) #
if draw_line:
gene_line(draw, width, height)
gene_line(draw, width, height)
gene_line(draw, width, height)
gene_line(draw, width, height)
image = image.transform((width + 20, height +10), Image.AFFINE, (1, -0.3, 0, -0.1, 1, 0), Image.BILINEAR) #
image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) # ,
image.save('%s/%s.png' %(save_path,filename)) #
print("savepath:",save_path)
return text
if __name__ == "__main__":
gene_code('/tmp','test') # /tmp/test.png
2.django 프로젝트 에 어떻게 적용 합 니까?전체 인증 코드 의 절 차 는 다음 과 같다.
1.사용자 가 로그 인 페이지 에 접근 하면 배경 프로그램 이 사용자 에 게 로그 인 페이지 로 돌아 갈 때 인증 코드 그림 을 생 성 합 니 다.
2.사용자 가 계 정 정보 와 인증번호 숫자 를 입력 하고 양식 을 제출 합 니 다.
3.배경 에서 사용자 가 입력 한 인증 코드 와 당신 이 생 성 한 이미지 정보 가 일치 하 는 지 판단 합 니 다.일치 하면 인증 코드 에 문제 가 없다 는 뜻 입 니 다.
문 제 는 세 번 째 단계 에 걸 려 있 습 니 다.첫 번 째 단계 에서 인증 코드 를 만 들 고 사용자 에 게 돌아 간 후에 사용자 가 이 인증 코드 를 제출 해 야 하기 때문에 배경 에서 사용자 가 입력 한 것 과 이전에 생 성 된 인증 코드 를 비교 해 야 합 니 다.
그래서 인증 코드 를 만 드 는 동시에 인증 코드 를 저장 하고 어디 에 저장 해 야 합 니까?반드시 캐 시 입 니 다.이렇게 저장 하 는 동시에 시간 초과 시간 을 추가 하면 인증 코드 의 유효기간 을 제한 할 수 있 습 니 다.
그럼 캐 시 에 저장 할 때 키 는 무엇으로 설정 되 어 있 습 니까?인증 코드 의 안전 을 확보 하기 위해 서 나 는 다음 과 같은 설 계 를 채택 했다.
3.코드 구현
login 보기
def acc_login(request):
err_msg = {}
today_str = datetime.date.today().strftime("%Y%m%d")
verify_code_img_path = "%s/%s" %(settings.VERIFICATION_CODE_IMGS_DIR,
today_str)
if not os.path.isdir(verify_code_img_path):
os.makedirs(verify_code_img_path,exist_ok=True)
print("session:",request.session.session_key)
#print("session:",request.META.items())
random_filename = "".join(random.sample(string.ascii_lowercase,4))
random_code = verify_code.gene_code(verify_code_img_path,random_filename)
cache.set(random_filename, random_code,30)
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
_verify_code = request.POST.get('verify_code')
_verify_code_key = request.POST.get('verify_code_key')
print("verify_code_key:",_verify_code_key)
print("verify_code:",_verify_code)
if cache.get(_verify_code_key) == _verify_code:
print("code verification pass!")
user = authenticate(username=username,password=password)
if user is not None:
login(request,user)
request.session.set_expiry(60*60)
return HttpResponseRedirect(request.GET.get("next") if request.GET.get("next") else "/")
else:
err_msg["error"] = 'Wrong username or password!'
else:
err_msg['error'] = " !"
return render(request,'login.html',{"filename":random_filename, "today_str":today_str, "error":err_msg})
템 플 릿 파일
{% extends 'base.html' %}
{% block body %}
<div id="container" class="cls-container">
<!-- BACKGROUND IMAGE -->
<!--===================================================-->
<div id="bg-overlay" class="bg-img img-balloon"></div>
<!-- HEADER -->
<!--===================================================-->
<div class="cls-header cls-header-lg">
<div class="cls-brand">
<a class="box-inline" href="index.html" rel="external nofollow" >
<!-- <img alt="Nifty Admin" src="img/logo.png" class="brand-icon"> -->
<span class="brand-title">PerfectCRM <span class="text-thin"> </span></span>
</a>
</div>
</div>
<!--===================================================-->
<!-- LOGIN FORM -->
<!--===================================================-->
<div class="cls-content">
<div class="cls-content-sm panel">
<div class="panel-body">
<p class="pad-btm">Sign In to your account</p>
<form method="post">{% csrf_token %}
<div class="form-group">
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-user"></i></div>
<input type="text" name="username" class="form-control" placeholder="Username">
</div>
</div>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-asterisk"></i></div>
<input type="password" name="password" class="form-control" placeholder="Password">
</div>
</div>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">
<img height="30px" src="/static/verify_code_imgs/{{ today_str }}/{{ filename }}.png">
</div>
<input style="height: 50px" type="text" name="verify_code" class="form-control" placeholder=" ">
<input type="hidden" name="verify_code_key" value="{{ filename }}" >
</div>
</div>
<div class="row">
<div class="col-xs-8 text-left checkbox">
<label class="form-checkbox form-icon">
<input type="checkbox"> Remember me
</label>
</div>
<div class="col-xs-4">
<div class="form-group text-right">
<button class="btn btn-success text-uppercase" type="submit">Sign In</button>
</div>
</div>
</div>
{% if error %}
<span style="color: red">{{ error.error }}</span>
{% endif %}
</form>
</div>
</div>
<div class="pad-ver">
<a href="pages-password-reminder.html" rel="external nofollow" class="btn-link mar-rgt">Forgot password ?</a>
<a href="pages-register.html" rel="external nofollow" class="btn-link mar-lft">Create a new account</a>
</div>
</div>
<!--===================================================-->
</div>
<!--===================================================-->
<!-- END OF CONTAINER -->
{% endblock %}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.