首页 > 其他分享 >Django登录页面优化--动态验证码

Django登录页面优化--动态验证码

时间:2023-08-19 22:55:42浏览次数:37  
标签:-- request 验证码 django captcha import login Django

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>

最终优化登录页面

 

 

 

 

 

         

标签:--,request,验证码,django,captcha,import,login,Django
From: https://www.cnblogs.com/weiweirui/p/17643364.html

相关文章

  • C/C++ 中 static 关键字解析
    局部静态变量的特点:全局数据区执行到函数内对象声明处首次初始化,若没有显示初始化,自动初始化为0,且只初始化一次始终驻留在全局区,直到程序结束,作用域为局部作用域,在函数或语句块内,生命周期到程序结束全局静态变量的特点:全局区在main函数执行前分配内存并初始化注意:......
  • df_sql_str
    #!/usr/bin/envpython#-*-encoding:utf-8-*-importpandasaspdimportnumpyasnp#生成一个dfdates=pd.date_range('20210913',periods=6)df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))print(df)#定义df输入源,以及目标......
  • mybatis设置命名格式转换 与 批量插入更新&select查询返回自定义实体类 的sql写法
    在mybatis的配置文件中设置了Java实体类驼峰命名与表属性下划线命名的自动转换。在mybatis中,从接口获取到大量数据之后,将数据集合分批量插入更新到表中。在mybatis中,select查询表数据,返回数据的存储类型为自定义的实体类。1.设置Java实体类驼峰命名与表属性下划线......
  • Springboot websocket简单使用
    1、在pom.xml导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>2、在SpringBoot项目的service层中创建一个Host类,其中包含一个getCPUUsage()方法用于定时获取......
  • *【学习笔记】(10) 块状链表
    块状链表(尚未完善)对于线性表,可以\(O(1)\)的访问,但是插入和删除操作是\(O(n)\)对于链表,可以\(O(1)\)的进行插入和删除,但是是\(O(n)\)的访问。于是本着分块的思想,有了块状链表。大概长这个样子。每个块的大小数量级在\(O(\sqrt{n})\),块数的量级\(O(\sqrt{n})\)主......
  • 以二进制文件安装K8S之高可用部署架构
    在Kubernetes系统中,Master节点扮演着总控中心的角色,通过不间断地与各个工作节点(Node)通信来维护整个集群的健康工作状态,集群中各资源对象的状态则被保存在etcd数据库中。在正式环境中应确保Master的高可用,并启用安全访问机制,至少包括以下几方面。Master的kube-apiserver、kube-c......
  • 以二进制文件安装K8S之创建CA根证书
    为etcd和Kubernetes服务启用基于CA认证的安全机制,需要CA证书进行配置。如果组织能够提供统一的CA认证中心,则直接使用组织颁发的CA证书即可。如果没有统一的CA认证中心,则可以通过颁发自签名的CA证书来完成安全配置。如下以通过颁发自签名的CA证书来完成安全配置。etcd和Kubernet......
  • 以二进制文件安装K8S之环境准备
    为了k8s集群能正常运行,需要先完成4项准备工作:1.关闭防火墙2.禁用SeLinux3.关闭Swap4.安装Docker关闭防火墙#查看防火墙状态getenforce#关闭防火墙,禁用防火墙开机自启动systemctlstopfirewalldsystemctldisablefirewalld禁用SeLinux#临时禁用SeLinux,重启失效......
  • 以二进制文件安装K8S之部署etcd高可用集群
    概述前提条件:已经准备好CA根证书(etcd在制作CA证书时需要CA根证书),并且把CA根证书文件ca.key和ca.crt拷贝到3个etcd节点的/etc/kubernetes/pki目录下。3台主机的IP地址分别为192.168.3.135、192.168.3.136、192.168.3.137。要安装的etcd版本:v3.4.13-linux-amd64。安装etcd下载e......
  • Linux Mint 21.3 计划于 2023 年圣诞节发布
    Linux Mint项目近日公布了基于Ubuntu的LinuxMint发行版下一个重要版本的一些初步细节,以及备受期待的基于Debian的LMDE6(LinuxMintDebianEdition)版本。近日,LinuxMint项目负责人克莱门特-勒菲弗(ClementLefebvre)给出了答案:LinuxMintDebianEdition6的开......