Flask实现用户登录注册(附前后端源码)

2023-11-11

效果展示:

登录

注册

主页面

项目结构

项目结构如下:

项目采用蓝图进行视图函数的管理,每个功能被放在一个小的app中。登录和注册功能放在了app_login文件夹中。

后端Python代码

app/login中的__init__.py创建了一个蓝图,内容如下:

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/8 23:19

"""登录视图的蓝图"""
from flask import Blueprint

login = Blueprint("login", __name__)
from . import view

models.py创建了一个数据模型User,对应数据库中的用户表,内容如下:

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/4 20:00

"""登录需要的数据库模型(用户表)"""
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from app import db


class User(UserMixin, db.Model):
    # 第一个参数指定字段类型,后面设置属性
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    count = db.Column(db.String(128), nullable=False)
    password = db.Column(db.String(128), nullable=False)

    def __init__(self, count, password):
        self.count = count
        self.password = password

    def set_password(self, password):
        self.password = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password, password)


if __name__ == '__main__':
    user = User(count='0101', password=2021)
    db.session.add(user)
    db.session.commit()

viesw.py存放登录、注册的视图函数,内容如下:

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/6 11:39

"""登录的视图函数"""
from flask import request, render_template, redirect, url_for, flash
from flask_login import login_required, login_user
from . import login
from .models import User
from app import login_manager


@login_manager.user_loader
def load_user(user_id):  # 创建用户加载回调函数,接受用户 ID 作为参数
    user = User.query.get(int(user_id))  # 用 ID 作为 User 模型的主键查询对应的用户
    return user  # 返回用户对象


@login.route('/index', methods=['GET', 'POST'])
@login_required
def index():
    if request.method == "GET":
        return render_template('index.html')


@login.route('/register', methods=['GET', 'POST'])
def register():
    # 如果请求为post
    if request.method == 'POST':
        count = request.form.get('count')
        password = request.form.get('password')
        repassword = request.form.get('repassword')
        print(count, password)
        from app import db
        if password == repassword:
            user = User(count, password)
            user.set_password(password)
            db.session.add(user)
            db.session.commit()
            return '注册成功'
        else:
            return '两次密码不一致'
    # 请求为get
    return render_template('register.html')


@login.route('/', methods=['GET', 'POST'])
@login.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        count = request.form['count']
        password = request.form['password']
        print(password)
        if not count or not password:
            flash('Invalid input.')
            return redirect(url_for('login'))
        user = User.query.filter_by(count=count).first()
        if not user:
            flash("用户不存在")
            return redirect(url_for('login.login'))
        if count == user.count and user.check_password(password):
            login_user(user)  # 登入用户
            flash('Login success.')
            print("登录成功")
            return redirect(url_for('login.index'))  # 重定向到主页

        flash('Invalid username or password.')  # 如果验证失败,显示错误消息
        return redirect(url_for('templates.login'))  # 重定向回登录页面
    return render_template('login.html')

配置文件config.py

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/3 15:08

"""各种配置类"""


class BaseConfig(object):
    """所有配置类的基类"""
    SECRET_KEY = "LOVE"
    DEBUG = True
    TESTING = False
    VISIT_TIME = 0  # 网站访问次数
    # 数据库配置
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:自己的MySql密码@localhost/personalwebsite"
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 是否追踪数据库的修改


class ProductionConfig(BaseConfig):
    """生产环境下的配置类"""
    DEBUG = False


class DevelopmentConfig(BaseConfig):
    """开发模式下的配置类"""
    DEBUG = True
    TESTING = True

app/__init__.py

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/3 1:54

"""构建app,注册蓝图"""

from flask import Flask
from config import BaseConfig
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy

login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'login'
db = SQLAlchemy()


def register_bp(app):
    """
    注册蓝图
    :param app:
    :return:
    """
    from .app_login import login as login_blueprint
    app.register_blueprint(login_blueprint)

def database(app, db):
    """
    初始化数据库
    :param app:
    :return:
    """
    db.init_app(app)
    db.create_all()
    db.session.commit()


def create_app():
    my_app = Flask(__name__)
    with my_app.app_context():
        # app注册蓝图
        register_bp(my_app)
        # app加载配置
        my_app.config.from_object(BaseConfig)
        # 数据库管理对象
        database(my_app, db)
        # 用于登录验证
        login_manager.init_app(my_app)
        login_manager.login_view = 'login.login'
    return my_app

启动文件manager.py

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/3 13:50

"""启动文件"""
from app import create_app
from flask import render_template, session

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

前端代码(没有使用bootstrap)

html部分

登录login.html页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <link rel="stylesheet" type="text/css" href="../static/css/login.css"/>
    <script src="../static/js/register.js" type="text/javascript"></script>

</head>
<body>

<div class="login-box">
    <h2>入口</h2>
    <form action="/login" method="post">
        <div class="login-field">
            <span style="color: aqua; size: 12px">账号</span>
            <input type="text" name="count" required=""/>
        </div>
        <div class="login-field">
            <spqn style="color: aqua; size: 12px">密码</spqn>
            <input type="password" name="password" required=""/>
        </div>
        <input type="submit" value="点击进入" id="myloginlabel">
        <p style="color: #101113">没有账号?<a href="./register" style="color: rgba(22,180,166,0.58)" onclick="topggleForm();">注册</a></p>
    </form>
</div>
</body>
</html>

注册register.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" type="text/css" href="../static/css/login.css"/>
    <script src="../static/js/register.js" type="text/javascript"></script>

</head>
<body>
<div class="login-box">
    <h2>注册</h2>
    <form action="/register" method="post">
        <div class="login-field">
            <span style="color: aqua; size: 12px">账号</span>
            <input type="text" name="count" required=""/>
        </div>
        <div class="login-field">
            <spqn style="color: aqua; size: 12px">密码</spqn>
            <input type="password" name="password" required=""/>
        </div>
        <div class="login-field">
            <spqn style="color: aqua; size: 12px">确认密码</spqn>
            <input type="password" name="repassword" required=""/>
        </div>
        <input type="submit" value="提交" id="myloginlabel">
        <p style="color: #101113">已有账号?<a href="./login" style="color: rgba(22,180,166,0.58)" onclick="topggleForm();">登录</a></p>
    </form>
</div>
</body>
</html>

主页面index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <link rel="stylesheet" type="text/css" href="../static/css/index.css"/>

</head>
<body>


</body>
</html>

css部分

login.css

body {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
    background-size: cover;


    background: url(../images/bg.jpg) no-repeat fixed center 0;
    -webkit-background-size: cover;
    -o-background-size: cover;
    -moz-background-size: cover;
    -ms-background-size: cover;

}

.login-box {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 400px;
    padding: 40px;
    background: rgba(16, 17, 19, 0.58);
    box-sizing: border-box;
    box-shadow: 0 10px 25px rgb(16, 17, 19);
    border-radius: 10px;
}

.login-box h2 {
    margin: 0 0 30px;
    padding: 0;
    text-align: center;
    color: #ffffff;
}

.login-box .login-field {
    position: relative;
}

.login-box .login-field input {
    width: 100%;
    padding: 10px 0;
    font-size: 16px;
    color: #ffffff;
    margin-bottom: 30px;
    border: none;
    border-bottom: 1px solid #ffffff;
    outline: none;
    background: transparent;
}

.login-box .login-field label {
    position: absolute;
    top: 0;
    left: 0;
    letter-spacing: 1px;
    padding: 10px 0;
    font-size: 16px;
    color: #ffffff;
    pointer-events: none;
    transition: .5s;
}

.login-box .login-field input:focus ~ label,
.login-box .login-field input:valid ~ label {
    top: -23px;
    left: 0;
    color: aqua;
    font-size: 12px;
}

.login-box button {
    border: none;
    outline: none;
    color: #fff;
    background: #03a9f4;
    padding: 10px 20px;
    cursor: pointer;
    border-radius: 5px;

}

#myloginlabel{
        position: relative;

        background-color: rgb(3, 168, 243);
        border: 1px solid rgb(190, 225, 255);
        width: 100px;
        height: 30px;
        font-size: 12px;
        color: rgb(255, 255, 255);
        font-weight: 200;
        margin-top: 10px;
        text-align: center;
        border-radius: 20px;
        padding: 10px;
}

index.css

body {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
    background-size: cover;


    background: url(../images/index.jpg) no-repeat fixed center 0;
    -webkit-background-size: cover;
    -o-background-size: cover;
    -moz-background-size: cover;
    -ms-background-size: cover;

}

js部分

register.js

function topggleForm() {
    var container = document.querySelector('.container');
    container.classList.toggle('active');
}

两张背景图片(有需求自取,当然也可以换自己喜欢的,推荐一个网站https://pixabay.com/zh/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask实现用户登录注册(附前后端源码) 的相关文章

  • xlsxwriter 错误:AttributeError:“工作簿”对象没有属性“add_format”

    我正在使用 xlsxwriter 进行一些简单的条件格式化 但是当我运行下面的代码时出现此错误 AttributeError Workbook object has no attribute add format 我已经更新了 xlsxwr
  • 打乱列表并返回副本

    我想对数组进行洗牌 但我找到的只是类似的方法random shuffle x from 在 Python 中随机化字符串列表的最佳方法 https stackoverflow com questions 1022141 best way t
  • 使用 scipy.signal.spectrogram 在 pyqtgraph 中绘制 wavfile 的频谱

    我有一个用于音乐和语音分析的 PyQt 加 pyqtgraph 程序 我想绘制 wav 文件的频谱 使用 scipy python 包计算 我可以在 matplotlib 中完成 但由于 matplotlib 的性能 我需要切换到 pyqt
  • 如何并行安装/编译 pip 要求(使 -j 等效)

    我的 pip 要求中有很多软件包需要安装 我想并行处理它们 我知道 例如 如果我想要n并行作业来自make我必须写make j n 是否有满足 pip 要求的等效命令 Thanks 有时 pip 使用 make 来构建依赖项 如果在开始之前
  • 如何获取Python对象父级?

    所以 我试图获取自定义对象 内部 的对象 这是一个例子 假设 o 是一个对象 无论是什么类型 它都可以存储变量 o Object class Test def init self self parent o This is where I
  • 字符串中数字的连续相加

    我是一名正在学习 python 的新程序员 并且在如何完成此任务方面遇到了困难 所以本质上我有一个从文件导入的数字字符串需要读取 并且需要将第一个数字的总和添加到第二个数字并将其转换为正确的 ascii 字符 因此 例如 如果我正在读取字符
  • Django 视图集没有属性“get_extra_actions”

    我第一次使用 Django 我正在尝试构建一个 API 我正在遵循一些教程和示例 它工作正常 但在安装所有要求和项目后 我现在正在 Raspberry Pi 中运行该项目失败并出现以下错误 Performing system checks
  • 将 Python 字典中的键替换为唯一值

    a 0 PtpMotion 1 PtpMotion 2 LinMotion 3 LinMotion 4 LinMotion 5 LinMotion 6 LinMotion 7 LinMotion 8 LinMotion 9 PtpMotio
  • 将 Python 列表(JSON 或其他)插入 MySQL 数据库

    所以我在Python中有一堆数组数据 嗯 相反 我有一个清单 我试图将此数组存储到 MySQL 数据库中的单个单元格中 我尝试使用 JSON 来序列化我的数据 但也许我不明白 JSON 是如何工作的 因此 在连接到我的数据库后 我尝试了上游
  • 使用unittest时如何知道每次测试花费的时间?

    Unittest 仅显示运行所有测试所花费的总时间 但不单独显示每个测试所花费的时间 使用unittest时如何添加每个测试的计时 我想 目前不可能 http bugs python org issue4080 http bugs pyth
  • 使用 Django 添加额外 \\ 字符的 JSON 编码

    我正在尝试创建一个函数 将包含消息和 Django 模型实例的字典转换为 JSON 然后我可以将其传回客户端 例如 我在 models py 中定义了模型 Test from django db import models class Te
  • 如何将 bisect.insort_left 与键一起使用?

    文档缺少示例 你如何使用bisect insort left 基于密钥 尝试根据键插入 bisect insort left data brown 7 将插入放在data 0 从文档 bisect insort left a x lo 0
  • 如何使用 python 在 XML 声明后添加注释

    import xml etree ElementTree as ET def addCommentInXml fileXml C Users Documents config xml tree ET parse fileXml root t
  • 如果出现重复,则主键取正值

    我有一个数据框df Key1 Key2 Value K11 K21 V1 K11 K21 V1 K13 K23 V2 K13 K23 V2 现在 例如对于相同的键 K11 K21 组合 我们有 2 个值 一负一正 如何从此 df 中仅获取正
  • 仅将唯一行插入 SQLite (python)

    我在用着cursor executemany将 CSV 文件中的批量行插入到 SQLite 表中 根据主键字段 其中一些行预计会重复 当我执行该命令时 可以预见的是 我会收到完整性错误 并且不会插入任何内容 如何有选择地仅插入非重复行 而无
  • 带有远程解释器的 Python 控制台无法在 PyCharm 中接受输入

    我是使用 PyCharm 进行远程开发的新手 我设置了一个远程环境 除了一个例外之外它工作正常 无法在控制台中接受用户输入 在控制台中运行以下语句时 控制台被阻塞 提示 上一个命令仍在运行 请等待或按控制台中的 Control C 来中断
  • 使用 Pandas 来“applymap”来访问索引/列?

    解决以下 pandas 问题的最有效方法是什么 这是一个简化的示例 其中包含数据框中的一些数据 import pandas as pd import numpy as np df pd DataFrame np random randint
  • 如何在我的 heroku 应用程序上安装软件包?

    我有一个使用 Shortuuid 的应用程序 https pypi python org pypi shortuuid 0 1 https pypi python org pypi shortuuid 0 1 当我使用 runapp py
  • 子进程调用,它们是并行完成的吗?

    我一直在谷歌搜索这个问题的答案 但似乎没有一个答案 谁能告诉我如果subprocess模块是否并行调用 Python 文档建议它可用于生成新进程 但没有提及它们是否并行 如果它们可以并行完成 您能否给我举一个例子或将我链接到一个例子 这取决
  • 与仅调用依赖函数/类相比,在 FastAPI 中使用 Depends 有哪些优点?

    FastAPI 提供了way https fastapi tiangolo com tutorial dependencies 通过其自己的依赖关系解析机制来管理依赖关系 例如数据库连接 它类似于一个pytest夹具系统 简而言之 您在函数

随机推荐

  • C++ 中的sort()排序函数原理、用法看这一篇就够了

    C 中的sort 排序函数原理 用法用法看这一篇就够了 sort first pointer first pointer n cmp 该函数可以给数组 或者链表list 向量排序 原理 sort并不是简单的快速排序 它对快速排序进行了优化
  • CT2A

    1 CString转为char char szAsciiIP 64 memcpy szAsciiIP CT2A m pEncoder gt m strIP sizeof szAsciiIP 2 详见MSDN http msdn micros
  • 异地远程访问本地SQL Server数据库【无公网IP内网穿透】

    iOS开发上架主页 在强者的眼中 没有最好 只有更好 我们是移动开发领域的优质创作者 同时也是阿里云专家博主 关注我们的主页 探索iOS开发的无限可能 我们与您分享最新的技术洞察和实战经验 助您在移动应用开发领域取得成功 欢迎访问我们的微信
  • CheckReturn(检查返回值)

    Loki库提供了一种方法 要求函数返回后 使用者必须对其进行检查或则赋值 以必须判断指针为例进行说明 自己写的代码简化了很多 CheckReturn h pragma once include
  • TSubclassOf

    在蓝图或C 层面调用SpawnActor创建一个actor对象 或者调用SpawnActorDeferred 延迟创建一个actor对象时 都需要一个class类型的参数 如果在C 层面 对象类型是我们自己在蓝图里做的蓝图类 那么C 层面需
  • 【智能优化算法】基于败者淘汰机制的烟花算法LOTFWA求解单目标烟花优化问题附matlab代码...

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 作为一种新兴的群体智能优化算法 烟花算法通过模拟烟花在空中爆炸产生火花的过程来进行最
  • 软件工程作业四

    2 用面向数据流的方法设计下列系统的软件结构 1 储蓄系统 参见习题2第2题
  • webpack学习4:热模替换、devtool、准备生产环境、清除打包文件目录

    热模替换功能 之前的webpack dev server是全部刷新 热模替换是局部刷新 详细配置见官网 指南 gt 模块热替换 修改devServer配置devServer contentBase resolve dirname build
  • Solr 实体嵌套

    公司主要测业务是 城市档案馆建设 一份案卷包含一个或多个业务实现 现在需要solr 索引库能够已经相关业务事项的 证号 单位 来进行相关功能检索 相关功能业务实现 以案卷为主表嵌套其他业务事项表 在solr的 data config xml
  • jmeter用循环控制器和计数器,直接查询数据库获取数据作为后续接口的参数

    一 导入mysql驱动jar包 二 添加线程组 jdbc配置文件 三 添加jdbc请求 设置参数变量 四 添加循环控制器 然后在其中加入计数器如下 五 用函数助手生成 V buyer code M 和 V buyer shortname N
  • 蓝桥杯JAVA B组 2022第四题 最少刷题数

    一 题目描述 二 思路分析 1 对输入的刷题数进行排序 2 分情况考虑 奇数情况下 超过中间值才能满足全班刷题比他多的学生数不超过刷题比他少的学生数 偶数情况下需要等于中间偏大的值就可以满足条件 三 代码 import java util
  • 西门子s300编程实例_plc西门子s300编程 西门子编程1000例

    西门子PLCS 200与S300 400系列编程电缆可以同意吗 西门子PLC S 200与S300 400系列编程电缆 如果是USB原装的 可以通用 价格2000元左右 西门子PLC S 200编程线型号PC PPI或者USB PPI 山寨
  • React 窗口防抖

    假如有这种需求 浏览器的窗口不断缩小变大 此时页面的布局不会自动刷新 需要手动刷新页面才会自适应大小 此时我们立马就会想到使用windows的onresize方法 window onresize gt 重新渲染画面 root render
  • 一起学nRF51xx 22 -  实现一个具体SVC调用功能的demo

    前言 上一节 一起学nRF51xx 21 蓝牙项目工程的初始化流程解读 讲到nordic的蓝牙协议栈是通过SVC来实现APP与协议栈之间通接口调用的 那么如何来实现一个具体SVC调用功能的程序呢 本节将带大家解决这个问题 示例详解 基于硬件
  • 【Python实战】数据预处理(数据清理、集成、变换、归约)

    Python实战 数据预处理 前言 数据预处理概述 数据清理 异常数据处理 1 异常数据分析 2 异常数据处理方法 缺失值处理 噪声数据处理 数据集成 1 实体识别 2 冗余属性 3 数据不一致 数据变换 1 使用简单的数学函数对数据进行变
  • 可验证延迟函数(VDF)

    干货 可验证延迟函数 VDF 自从以太坊将可验证延迟函数 Verifiable Delay Function VDF 列入研究计划并打算在以太坊 2 0 使用之后 VDF 得到了广泛的关注 VDF 这个概念最初由斯坦福大学密码学教授 Dan
  • osgEarth的Rex引擎原理分析(二十)osgEarth::TerrainEngineNode中setMap方法作用

    目标 十二 中的问题12 不同于派生类RexTerrainEngineNode中setMap的内容 详见 十二 在RexTerrainEngineNode执行setMap时会首先调用TerrainEngineNode的setMap 这里主要
  • NCRE网络技术知识点

    备考NCRE的三级网络技术 主要以刷题为主 考试大部分是题库中的原题 刷题的过程也要主要总结和复习 因为题库有很多重复的题目 重复的知识点 但是考试的时候记忆不清晰的话很容易重复犯错 弹性分组环 RPR 中每一个节点都执行SRP公平算法 与
  • CC攻击是怎么查看和预防的,云服务器有没有办法防止CC攻击

    网站被CC攻击后会出现访问速度很慢 影响用户体验 被搜索引擎K站 排名消失 那么 怎么排查自己被CC了呢 所谓的CC攻击 就是攻击者借助代理服务器生成指向受害主机的合法请求 从而实现DDOS和伪装 1 如果网站是动态网站 比如asp asp
  • Flask实现用户登录注册(附前后端源码)

    效果展示 登录 注册 主页面 项目结构 项目结构如下 项目采用蓝图进行视图函数的管理 每个功能被放在一个小的app中 登录和注册功能放在了app login文件夹中 后端Python代码 app login中的 init py创建了一个蓝图