BBS项目--登录

news2024/11/25 0:22:52

BBS阶段性测试总要求

django登录报错

Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

原因分析:出现这种情况在Windows中很常见,就是端口被占用

解决措施:这时我们只需改一下端口便可以了

登录前端页面(HTML)

# 这次页面采用的是bookstrip5:Bootstrap 入门 · Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 (bootcss.com)

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>

<style>
        html,
        body {
            height: 100%;
        }

        body {
            display: flex;
            align-items: center;
            padding-top: 40px;
            padding-bottom: 40px;
            background-color: #f5f5f5;
        }

        .form-signin {
            max-width: 330px;
            padding: 15px;
        }

        .form-, .form-floating:focus-within {
            z-index: 2;
        }

        .form-signin input[type="email"] {
            margin-bottom: -1px;
            border-bottom-right-radius: 0;
            border-bottom-left-radius: 0;
        }

        .form-signin input[type="password"] {
            margin-bottom: 10px;
            border-top-left-radius: 0;
            border-top-right-radius: 0;

        a {
            color: rgba(1, 4, 12, 0.92);
            ext-decoration: none;
        }

        }
</style>
# body部分:
<body>
<main class="form-signin w-100 m-auto">

    <div class="text-center">
        <div class="form-group">
            <label for="id_avatar">
                <img class="mb-4 "
                     src="https://tse3-mm.cn.bing.net/th/id/OIP-C.VeJFhbdc95msPtA2RFHHbwAAAA?rs=1&pid=ImgDetMain"
                     alt="" height="80px" width="80px" id="id_img1"
                     style="margin-left: 20px">
            </label>
            <input type="file" id="id_avatar" class="form-control" accept="image/*" style="display: none">
            <h1 class="h3 mb-3 fw-normal">糖果爱上我</h1>
            </label>
        </div>
    </div>
    <form id="login_form">
        {% csrf_token %}
        <div class="form-floating">
            <div class="group-group">
                <label for="id_username">用户名</label>
                <input type="text" name="username" class="form-control"
                       id="id_username">
                <span class="pull-right error" style="color: red"> </span>
            </div>
            <div class="form-group">
                <label for="floatingInput">密码</label>
                <input type="password" name="password" class="form-control"
                       id="id_password">
                <span class="pull-right error" style="color: red"> </span>
            </div>
            <div class="form-group">
                <label for="floatingInput">验证码</label>
                <div class="row">
                    <div class="col-md-6">
                        <input type="text" name="code" class="form-control" id="id_code">
                    </div>

                    <img src="/get_valid_code/" alt="" class="col-md-6" height="35" id="id_img">
                </div>
            </div>
        </div>
    </form>
    <div class="w-100 btn btn-lg btn-primary" id="id_submit" style="margin-top: 20px">登录</div>
    <span class="error" style="color: darkred;margin-left: 10px" id="id_error"></span>
    <p style="color: #888888">您还没账号吗?那我们先注册一个吧~ <a href="/register/">滴滴</a></p>
    <p class="mt-5 mb-3 text-muted">* 佳祺今天也要加油鸭</p>
</main>
</body>

验证码功能

# 能够显示验证码图片,随机改变验证码,点击图片就会自己刷新验证码

# 视图层后端,自定义验证码,验证码用session进行保存,方便后面验证是否正确:

from django.shortcuts import render, HttpResponse, redirect
from PIL import Image, ImageDraw, ImageFont
from .utills import get_random_code, get_random_rgb
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
import random, json
from io import BytesIO

def get_valid_code(request):
    height = 38
    width = 300
    image_tmp = Image.new('RGB', (300, 38), (255, 255, 255))
    # 把空图片放在了画板上,就可以写字了
    draw = ImageDraw.Draw(image_tmp)
    # 加入字体
    img_font = ImageFont.truetype('./static/font/ss.TTF', 23)
    # 验证码
    code_str = get_random_code()
    print(code_str)
    # 重要,要保存
    request.session['code'] = code_str
    for i, item in enumerate(code_str):
        draw.text((30 + i * 50, 3), item, fill=get_random_rgb(), font=img_font)  # (x轴,y轴),字,字颜色,字体

    # 增加难度--->在图片上画点
    for i in range(30):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_rgb())

        # 画弧形
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_rgb())
    # 在图片上划线
    for i in range(3):
        x1 = random.randint(0, width)
        x2 = random.randint(0, height)
        y1 = random.randint(0, width)
        y2 = random.randint(0, height)
        draw.line((x1, y1, x2, y2), fill=get_random_rgb())
    # 放在内存中,一旦不用,自动清理内存
    my_io = BytesIO()
    image_tmp.save(my_io, 'png')
    return HttpResponse(my_io.getvalue())

# 讲图片渲染在前端html页面:

<div class="form-group">
     <label for="floatingInput">验证码</label>
     <div class="row">
         <div class="col-md-6">
             <input type="text" name="code" class="form-control" id="id_code">
         </div>
         <img src="/get_valid_code/" alt="" class="col-md-6" height="35" id="id_img">
     </div>
</div>

# 设置验证码id,设置点击事件,使点击验证码图片会自己刷新验证码:

<script>
    $('#id_img').click(function () {
        // img标签有个特性:只要src变了,就会重新src地址请求拿数据
        var url = $(this).attr('src') + '?'  // /get_valid_code/???
        console.log(url)
        $(this).attr('src', url)
    })
</script>

图片渲染在前端配置

# 在django中,有两个额外自己建立的文件包:

media:一般存入其他用户上传的图片等等

static: 一般用于自身写入的引入样式,图片等等       

# 因此,存入的图片,我们想要渲染在前端页面,也需配置成静态文件

# settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

# 路由
path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT}),

ajax提交登录

# 前端把用户提交的数据发送到后端,设置button点击事件,用ajax提交数据:

<script>
$('#id_submit').click(function () {
            var serialize_data = $('#login_form').serializeArray()
            console.log(serialize_data)
            var data = {}
            var username = $('[name="username"]').val()
            var password = $('[name="password"]').val()
            var code = $('[name="code"]').val()
            var csrfmiddlewaretoken = $('[name="csrfmiddlewaretoken"]').val()
            data['username'] = username
            data['password'] = password
            data['code'] = code
            data['csrfmiddlewaretoken'] = csrfmiddlewaretoken
            console.log(data)
            $.ajax({
                url: '',
                method: 'post',
                data: data,
                success: function (data) {
                    console.log(data)
                    if (data.code == 100) {
                        location.href = data.url
                    } else {
                        $("#id_error").html(data.msg)
                    }
                }
            })
        })
</script>

# 后端拿到前端数据,先对验证码进行对比,然后使用auth模块直接讲用户名和密码与数据库中的进行比较,返回给前端信息,成功便直接跳转到主页面:

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('password')
        net_code = request.POST.get('code').lower()
        #
        code = request.POST.get('code').lower()  # 会存在bug
        # 1 校验验证码,取出老验证码,忽略大小写
        old_code = request.session.get('code').lower()
        if code == old_code:
            # 2 去验证用户了---》
            user = authenticate(username=username, password=password)
            if user:
                # 登录成功--->内部写session了
                auth_login(request, user)
                return JsonResponse({'code': 100, 'msg': '登录成功', 'url': '/'})
            else:
                return JsonResponse({'code': 101, 'msg': '用户名或密码错误'})
        else:
            return JsonResponse({'code': 102, 'msg': '验证码错误'})

今日思维导图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1326916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows netstat命令

文章目录 前言各选项的含义如下&#xff1a; 前言 Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具&#xff0c;它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检…

SQL基础:查询的基本使用

上一节我们讲述了记录的基本操作&#xff0c;这一节我们来单独讲一下查询。 查询基本结构 首先我们来看下查询的基本结构 SELECTcolumn1,column2,... FROMtable_name [WHEREcondition] [GROUP BYcolumn1, column2, ...] [HAVINGaggregate_function(column) condition] [ORDE…

使用docker-compose搭建docker私服与配置WebUI

简介 本文介绍了使用docker compose 搭建 docker私服 环境 Docker version 24.0.6, build ed223bc Docker Compose version v2.21.0 正文 一、创建registry文件夹 我的路径是/usr/loca/docker/registry 二、创建并编写docker-compose.yml version: "3.9" services…

MyBatis Plus使用遇到的问题

如果想使用Mapper的xxxById()方法&#xff0c;实体类的主键上面必须加上TableId注解&#xff0c;如果不加&#xff0c;会报错 2023-12-21 22:48:33.526 WARN 11212 --- [ main] c.b.m.core.injector.DefaultSqlInjector : class com.example.mybatisplusdemo.dom…

CEC2013(python):五种算法(GA、WOA、GWO、DBO、HHO)求解CEC2013(python代码)

一、五种算法简介 1、遗传算法算法GA 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、哈里斯鹰优化算法HHO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff1a; [1] Liang J J , Qu B Y , Suganthan P N , et al. Prob…

C语言---井字棋(三子棋)

Tic-Tac-Toe 1 游戏介绍和随机数1.1 游戏介绍1.2 随机数的生成1.3 棋盘大小和符号 2 设计游戏2.1 初始化棋盘2.2 打印棋盘2.3 玩家下棋2.4 电脑下棋2.5 判断输赢2.6 game()函数2.7 main()函数 3 完整三子棋代码3.1 Tic_Tac_Toe.h3.2 Tic_Tac_Toe.c3.3 Test.c 4 游戏代码的缺陷 …

3-高可用-隔离术

隔离是指将系统或资源分割开&#xff0c;系统隔离是为了在系统发生故障时&#xff0c;能限定传播范围和影响范围&#xff0c;即发生故障后不会出现滚雪球效应&#xff0c;从而保证只有出问题的服务不可用&#xff0c;其他服务还是可用的。 比较多的隔离手段有线程隔离、进程隔…

开源堡垒机JumpServer结合内网穿透实现远程访问

开源堡垒机JumpServer结合内网穿透实现远程访问 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 …

57 优化二进制序列

动态规划 #include <iostream> using namespace::std; using std::cout; using std::cin; int yhejz(int n, int nums[]) {int dp0 0;int dp1 0;int result -1;for(int i0; i<n; i){if(nums[i] 1){dp1;dp0;}else {dp1 dp01;dp0 0;}result max(dp1,max(dp0,re…

计算机毕业设计 基于SpringBoot的大学生平时成绩量化管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

在线培训考试系统的优势及应用场景介绍

在线培训考试系统是一种基于互联网的教育工具&#xff0c;它结合了在线培训和考试的功能&#xff0c;具有许多优势和广泛的应用场景。 提高学习效果 在线培训考试系统首先可以提高学习效果。系统提供了多媒体学习资源&#xff0c;例如文字、图片、音频和视频等&#xff0c;以…

Visual Studio 输入英文会在字母之间自动增加空格

问题如图&#xff1a; 原因&#xff1a;我们在输入中文的时候&#xff0c;不小心按下了shift空格键&#xff0c;比如&#xff1a; 此时&#xff0c;我们在输入中文的时候&#xff0c;再次按下shift空格键就可以恢复正常了。

docker部署个人网站项目记录(前后端分离)

背景 项目是前后端分离&#xff0c;前端有三部分&#xff0c;分别是 个人网站&#xff08;blog&#xff09;网站后台管理系统&#xff08;admin&#xff09;数据大屏&#xff08;datascreen&#xff09; 后端是基于nodejs写的后台服务 后台接口服务&#xff08;todo-nodejs…

uniapp图片上传说明

目录 1.文件上传组件 2.单文件上传 3.多文件上传 4.图片的回显 5.注意点 1.文件上传组件 前端上传组件使用uni-file-picker&#xff0c;可以自行进行下载使用。默认上传到绑定的服务空间&#xff0c;配置属性auto-upload为false关闭自动上传&#xff0c;可以限定上传的是…

【JAVA基础】DeferredResult使用详解

简介 Servlet3.0提供了基于servlet的异步处理api&#xff0c;Spring MVC只是将这些api进行了一系列的封装&#xff0c;从而实现了DeferredResult。 DeferredResult字面意思是"延迟结果"&#xff0c;它允许Spring MVC收到请求后&#xff0c;立即释放(归还)容器线程&…

OpenCV4工业缺陷检测的六种方法

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

【递归 回溯】LeetCode-17. 电话号码的字母组合

17. 电话号码的字母组合。 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digit…

轻量级web开发框架Flask本地部署及无公网ip远程访问界面

文章目录 前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用P…

JDBC常用API

在开发JDBC程序前&#xff0c;先了解一下JDBC常用的API。JDBC API主要位于java.sql包中&#xff0c;该包定义了一系列访问数据库的接口和类。 &#xff08;1&#xff09;Driver接口 Driver接口是所有JDBC驱动程序必须实现的接口&#xff0c;该接口专门提供给数据库厂商使用。需…

windows11下载GCC编译器

下载 1. 打开MinGW官网 2. 点击下载, 进入后选择下载在Window系统 3. 选择在github上面下载, 进入后下载下面两个即可, 一个是编译器, 一个是源码. 考虑跨平台性, 下载posix版本, 只在Windows下开发应用就下载win32, 不知道就下载前者. win11选择ucrt, 之前版本选择msvcrt. 配…