Django登录页面优化--动态验证码
本章节添加修改动态验证码功能,基于前一章使用的前端环境进行代码修改。
安装依赖库
pip install Pillow
pip install django-simple-captcha
添加captcha应用
在myproject/settings.py文件的INSTALLED_APPS列表中添加captcha应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'captcha',
'myapp',
]
配置视图
from django.contrib.auth import authenticate, login
from django.http import HttpResponse
from django.contrib import messages
from captcha.models import CaptchaStore
from captcha.helpers import captcha_image_url
from django.shortcuts import redirect
def login_view(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
captcha_solution = request.POST.get('captcha_solution')
captcha_key = request.POST.get('captcha_key')
# 验证码校验
if captcha_key and captcha_solution:
if not CaptchaStore.objects.filter(response=captcha_solution, hashkey=captcha_key).exists():
messages.error(request, '验证码错误')
return redirect('login')
# 身份验证
user = authenticate(request, username=username, password=password)
if user:
login(request, user)
return HttpResponse('登录成功!')
else:
messages.error(request, '用户名或密码错误')
return redirect('login')
new_key = CaptchaStore.generate_key()
image_url = captcha_image_url(new_key)
return render(request, 'login.html', {'key': new_key, 'image_url': image_url})
修改登录模板
在myapp/templates/login.html文件中,替换原先的验证码部分为动态生成的验证码代码
<label for="captcha_solution">验证码:</label>
<input type="text" id="captcha_solution" name="captcha_solution" required>
<img src="{{ image_url }}" alt="验证码">
<input type="hidden" name="captcha_key" value="{{ key }}">
完整配置如下
<!--添加动态验证码-->
{% if messages %}
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
{% endif %}
<form method="POST">
{% csrf_token %}
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<label for="captcha_solution">验证码:</label>
<input type="text" id="captcha_solution" name="captcha_solution" required>
<img src="{{ image_url }}" alt="验证码">
<input type="hidden" name="captcha_key" value="{{ key }}">
<button type="submit">登录</button>
</form>
</body>
</html>
配置添加路由
在myproject/urls.py文件中,修改URL配置如下
from django.contrib import admin
from django.urls import path, include
from myapp.views import login_view
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', login_view, name='login'),
path('captcha/', include('captcha.urls')),
]
运行代码
优化登录页面的背景功能
修改模版文件
将框居于页面右侧存放,并使框中的表单和验证码大小适中,您可以使用 CSS 的 margin 属性和一些调整。 要优化表单内容不超出框外,您可以使用 CSS 的 overflow 属性来控制框的溢出行为。 对 .login-form 的样式进行了修改。通过设置 overflow: hidden,我们隐藏了框外的内容,以确保表单内容不会溢出框外。 对 body 的样式进行了修改。通过设置 justify-content: flex-end,我们将框居于页面的右侧。
<!DOCTYPE html>
<html>
<head>
<style>
body {
display: flex;
justify-content: flex-end;
align-items: center;
height: 100vh;
background-image: url("https://img1.baidu.com/it/u=3663508195,2907650417&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1692378000&t=9f11a3e494efccd0dad4d4ce8fd1d627");
background-size: cover;
}
.login-form {
background-color: #fff;
padding: 20px;
border-radius: 5px;
width: 50%;
max-width: 300px;
overflow: hidden; /* 隐藏框外的内容 */
}
.login-form label {
display: block;
margin-bottom: 10px;
}
.login-form input {
width: 96%;
padding: 10px;
margin-bottom: 20px;
border: 1px solid #ccc;
border-radius: 5px;
}
.login-form img {
display: block;
margin-bottom: 10px;
width: 100%;
max-width: 200px;
}
.login-form button {
padding: 10px 20px;
background-color: #4CAF50;
color: #fff;
border: none;
border-radius: 5px;
cursor: pointer;
align-self: flex-end;
}
</style>
</head>
<body>
<div class="login-form">
{% if messages %}
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
{% endif %}
<form method="POST">
{% csrf_token %}
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<label for="captcha_solution">验证码:</label>
<input type="text" id="captcha_solution" name="captcha_solution" required>
<img src="{{ image_url }}" alt="验证码">
<input type="hidden" name="captcha_key" value="{{ key }}">
<button type="submit">登录</button>
</form>
</div>
</body>
</html>
最终优化登录页面