day78---博客项目之登录页面

/utils/verificatioz_code.py

	import random
	from io import BytesIO
	from PIL import Image, ImageDraw, ImageFont
	def random_color():
		"""
		随机RGB颜色
		:return:
		"""
		colors = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
		return colors
	def random_valid_code():
		"""
		生成随机验证码
		:return:
		"""
		io_obj = BytesIO()
		image_obj = Image.new(mode='RGB', size=(120, 80), color=random_color())
		draw_obj = ImageDraw.Draw(image_obj)
		font_obj = ImageFont.truetype('static/fonts/km.ttf', size=36)
		str_list = ''
		for i in range(4):
			random_chr = random.choice(
				[str(random.randint(0, 9)), chr(random.randint(65, 90)), chr(random.randint(97, 122))])
			draw_obj.text((i * 33, 20), random_chr, random_color(), font=font_obj)
			str_list += random_chr
		# width = 120
		# height = 80
		# for i in range(10):
		#     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())
		# for i in range(30):
		#     draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
		#     x = random.randint(0, width)
		#     y = random.randint(0, height)
		#     draw_obj.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())
		# for i in range(50):
		#     draw_obj.point((random.randint(0, width), random.randint(0, height)), fill=random_color())
		image_obj.save(io_obj, 'png')
		data = io_obj.getvalue()
		return data, str_list

urls.py

	url(r'^login/$', views.log_in),
	url(r'^logout/$', views.log_out),
	url(r'^valid_code/$', views.valid_code),

views.py

        from django.contrib import auth
        import json
        from utils.verification_code import random_valid_code
	def valid_code(request):
		"""
		返回随机验证码,并向诶如session
		:param request:
		:return:
		"""
		data = random_valid_code()
		# 把生成的随机验证码存储到session中
		request.session['str_code'] = data[1]
		return HttpResponse(data[0])
	def log_in(request):
		"""
		登录页面
		:param request:
		:return:
		"""
		if request.is_ajax():
			user = request.POST.get('user')
			pwd = request.POST.get('pwd')
			code = request.POST.get('code')
			# 获取随机验证码的session字符串
			str_code = request.session.get('str_code')
			# 定义默认返回信息
			login_response = {'user': None, 'err_msg': None}
			# 判断验证码
			if code.upper() == str_code.upper():
				# 判断用户名密码
				user_obj = auth.authenticate(username=user, password=pwd)
				if user_obj:
					login_response['user'] = user_obj.username
					auth.login(request, user_obj)
				else:
					login_response['err_msg'] = 'username and password is error !!!'
			else:
				login_response['err_msg'] = 'the random valid code is errer !!!'
			# ajax返回前端
			return HttpResponse(json.dumps(login_response))
		return render(request, 'login.html')
	def log_out(request):
		"""
		注销与退出
		:param request:
		:return:
		"""
		auth.logout(request)
		return redirect('/login/')

login.html

	<!DOCTYPE html>
	<html lang="en">
	<head>
		<meta charset="UTF-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7/css/bootstrap.min.css">
		<script src="/static/js/jquery-3.2.1.min.js"></script>
		<script src="/static/plugins/bootstrap-3.3.7/js/bootstrap.min.js"></script>
		<title>登录页面</title>
	</head>
	<body>
	<div class="container">
		<div class="row">
			<div class="col-md-offset-3 col-md-8">
				<div class="page-header">
					<h1>
						博客登录页面
						<small>...</small>
					</h1>
				</div>
				<form class="form-horizontal" action="" method="post" enctype="multipart/form-data">
					{% csrf_token %}
					<div class="form-group form-horizontal">
						<label for="user" class="col-md-2 control-label">用户名:</label>
						<div class="col-md-7">
							<input type="text" class="form-control" id="user" placeholder="用户名" autocomplete="off">
						</div>
						<span id="user_err" class="col-md-3 form-group control-label"></span>
					</div>
					<div class="form-group">
						<label for="pwd" class="col-md-2 control-label">密码:</label>
						<div class="col-md-7">
							<input type="password" class="form-control" id="pwd" placeholder="密码" autocomplete="off">
						</div>
						<span id="pwd_err" class="col-md-3 form-group control-label"></span>
					</div>
					<div class="form-group">
						<label for="code" class="col-md-2 control-label">验证码:</label>
						<div class="col-md-3">
							<input type="text" class="form-control" id="code" placeholder="验证码" autocomplete="off">
						</div>
						<div class="col-md-4">
							<img id="code_img" width="230" height="34" src="/valid_code/" alt="随机验证码">
						</div>
						<span id="code_err" class="col-md-3 form-group control-label"></span>
					</div>
					<div class="form-group">
						<div class="col-md-offset-2 col-md-10">
							<div class="checkbox">
								<label>
									<input type="checkbox">记住我
								</label>
							</div>
						</div>
					</div>
					<p class="col-md-offset-4 err_msg"></p>
					<div class="form-group">
						<div class="col-md-offset-2 col-md-7">
							<button type="button" id="login" class="btn btn-primary btn-block">登录</button>
						</div>
					</div>
				</form>
			</div>
		</div>
	</div>
	<script>
		// 验证码刷新
		$("#code_img").click(function () {
			$(this)[0].src += '?'
		});
		// 登录校验
		$("#login").click(function () {
			$.ajax({
				url: "",
				type: "post",
				data: {
					"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(),
					"user": $("#user").val(),
					"pwd": $("#pwd").val(),
					"code": $("#code").val()
				},
				success: function (data) {
					var login_response = JSON.parse(data);
					console.log(login_response);
					if (login_response.user) {
						location.href = '/index/'
					} else {
						$(".err_msg").html(login_response.err_msg).css({
							"color": "red",
							"font-size": 20,
							"font-weight": 700
						});
					}
				}
			})
		});
		setInterval(function () {
			$(".err_msg").html("")
		}, 3000)
	</script>
	</body>
	</html>
posted @ 2018-03-01 09:35  _岩哥  阅读(149)  评论(0)    收藏  举报