首页 > 其他分享 >BBS登录功能思路总结

BBS登录功能思路总结

时间:2023-01-08 20:24:43浏览次数:43  
标签:code obj 登录 random request 验证码 思路 BBS

BBS登录功能思路总结

目录

一、登录功能编写步骤概览

  • 渲染登录页面
  • 添加图片验证
  • 前端获取数据
  • 后端校验数据

二、登录功能编写步骤详细

1.开设登录接口

    # 登录功能
    path('login/', views.login_func, name='register_view'),

2.写登录视图函数先返回页面

def login_func(request):

    return render(request, 'loginPage.html')

3.创建登录前端页面 先渲染用户名密码和登录按钮

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
    <div class="col-md-8 col-md-offset-2">
        <h2 class="text-center">用户登录</h2>
        <div class="form-group">
            <label for="name">用户名</label>
            <input type="text" id="name" class="form-control" name="username">
        </div>
        <div class="form-group">
            <label for="password">密码</label>
            <input type="password" id="password" class="form-control" name="password">
        </div>
        <input type="button" class="btn btn-success btn-block" value="登录" id="loginBtn">
    </div>
</div>
</body>
</html>

4.开设验证码路由

    # 图片验证码相关功能
    path('get_code/', views.get_code_func),

5.写验证码的视图函数

# 1.先导入图片验证码相关的模块
from PIL import Image, ImageFont, ImageDraw
from io import BytesIO, StringIO
import random

# 2.写一个产生随机验证码的函数
def get_random():
    return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

# 3.在写获取验证码的代码
def get_code_func(request):
    # 先产生图片对象
    img_obj = Image.new('RGB', (350, 35), get_random())
    # 将图片对象交给画笔对象
    draw_obj = ImageDraw.Draw(img_obj)
    # 确定字体样式(ttf文件)
    font_obj = ImageFont.truetype('static/font/111.ttf', 35)
    # 产生随机验证码
    code = ''
    for i in range(5):
        random_upper = chr(random.randint(65, 90))
        random_lower = chr(random.randint(97, 122))
        random_int = str(random.randint(1, 9))
        # 三选一
        temp_choice = random.choice([random_upper, random_lower, random_int])
        # 写到图片上
        draw_obj.text((i * 60 + 45, 0), temp_choice, font=font_obj)
        code += temp_choice
    # 后端保存验证码 便于后续的比对
    request.session['code'] = code
    io_obj = BytesIO()
    img_obj.save(io_obj, 'png')
    return HttpResponse(io_obj.getvalue())

6.在前端编写获取验证码的代码

            <div class="form-group">
                <label for="code">验证码</label>
                <div class="row">
                    <div class="col-md-6">
                        <input type="text" id="code" class="form-control" name="code">
                    </div>
                    <div class="col-md-6">
                        <img src="/get_code/" alt="" width="350" height="35" id="d1">
                    </div>
                </div>
            </div>

7.在前端写script标签 写验证码动态刷新的代码

        // 1.验证码动态刷新
        $('#d1').click(function () {
            let oldSrc = $(this).attr('src');
            $(this).attr('src', oldSrc + '?')
        })

8.写Ajax请求

        // 2.登录按钮发送ajax请求
        $('#loginBtn').click(function () {
            console.log('dddd')
            // 可以再次使用form标签序列化功能 也可以自己挨个获取
            $.ajax({
                url:'',
                type:'post',
                data:{'username':$('#name').val(), 'password':$('#password').val(), 'code':$('#code').val(), 'csrfmiddlewaretoken':'{{ csrf_token }}'},
                success:function (args) {
                    if(args.code === 10000){
                        window.location.href = args.url
                    }else{
                        alert(args.msg)
                    }
                }
            })
        })

9.后端写登录信息比对逻辑代码

    back_dict = {'code': 10000, 'msg': ''}
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        code = request.POST.get('code')
        if code.upper() == request.session.get('code').upper():
            user_obj = auth.authenticate(request, username=username, password=password)
            if user_obj:
                # 保存用户登录状态
                auth.login(request, user_obj)  # 执行之后就可以使用request.user获取登录用户对象
                back_dict['msg'] = '登录成功'
                back_dict['url'] = '/home/'
            else:
                back_dict['code'] = 10001
                back_dict['msg'] = '用户名或密码'
        else:
            back_dict['code'] = 10002
            back_dict['msg'] = '验证码错误'
        return JsonResponse(back_dict)

10.登录功能前端展示效果图如下

image

标签:code,obj,登录,random,request,验证码,思路,BBS
From: https://www.cnblogs.com/almira998/p/17035257.html

相关文章

  • 力扣刷题思路
    1.常看Discussion。我相信很多同学为了刷题量,解开一道题后会迫不及待地点开下一道题。更为甚者,很多同学把刷题的数量作为衡量水平的绝对标准,比如「老师,我在Leetcode刷......
  • Python 获取并分析均价思路
    1、思路:分析网页,是静态网页后,用requests建立解析。2、步骤:--建立headers方法--拼接start-URL,--构件程序控制函数main控制运行,这里代码很少,其实不用的。--requests循......
  • SimpleAdmin手摸手教学之:登录鉴权
    一、前言不管是作为一个后台管理系统,还是客户端应用系统,登录都是一个必备的功能,基本上每个程序员都写过登录接口,基本就是用户输入账号密码然后去数据查比对是否一样,一样就......
  • BBS项目之注册功能思路总结
    目录BBS项目之注册功能思路总结一、项目注册功能概览二、项目注册功能步骤详细1.开设路由跳转2.写视图函数3.创建前端html注册页面4.写forms校验类5.在views.py里注册视图......
  • BBS升级版
    BBS项目项目的前期准备1.django2.2创建一个django目录(需要配置环境变量和数据库)'DIRS':[os.path.join(BASE_DIR,'templates'),]2.数据库准备我这......
  • SQL server数据库 账户SA登录失败,提示错误:18456
    在我们使用数据库的时候,偶尔会遇到一些登录上的错误提示。比如,在数据库配置上没有正确开启用户的登录策略以及服务器身份验证模式时,就会提示“用户’sa’登录失败。(Micros......
  • 窗体登录逻辑的实现2
    之前在窗体登录逻辑的实现-hanzq_go-博客园(cnblogs.com)中写过一个窗体登录逻辑的实现。这种方式是在应用程序的入口将登录窗体以showdialog的方式显示,如果返回Dial......
  • (笔记)在每个 Linux 用户SSH登录时执行自定义脚本
     有些时候,我们需要在linux用户登录时执行我们自己编写的脚本,比如登录时给个友好的交互输出提示。为了实现该目的,我们有必要去了解一下linux在用户登录时执行内部shell的......
  • metersphere将登录接口返回的token设置为全局变量,加到项目环境的请求头中
    1、获取token值,将token值加入到环境变量vars.put(${__metersphere_env_id}+"Authorization","${token}"); 2、执行登录,发现项目环境中的,通用配置有刚才加入的token;......
  • 简单java servlet的登录脚本,部署到docker
    先打算参考这篇文章Simpleloginpageexampleusingjspservlet-Candidjava内含war文件和zip文件。但是tomcat上该war文件总是报错。于是又参考这篇(46条消息)Jav......