Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能

news2024/11/28 12:50:09

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能

安装配置

首先确保已经安装如下程序:

  1. flask:用于构建web应用程序。
  2. flask-sqlalchemy:用于在 Flask 中连接 MySQL 数据库,通过pip install flask-sqlalchemy安装。
  3. pymysql:运行时可能会出现出现 ModuleNotFoundError: No module named ‘MySQLdb’ 错误,通常是由于缺少 MySQL Python 驱动程序导致的。这里我使用的是 PyMySQL 作为 MySQL 的连接器,通过pip install pymysql安装后,在连接数据库时将连接字符串中的 mysql 替换为 mysql+pymysql即可。
配置数据库连接信息,并创建 SQLAlchemy 用户对象

在配置文件模块config.py中,配置 数据库连接信息,并创建 SQLAlchemy 用户对象,这样就可以在其他地方直接引用:

# config.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()  # 创建全局的 SQLAlchemy 实例

def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    
    db.init_app(app)  # 在应用工厂函数中初始化 SQLAlchemy 实例
    
    return app

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True, nullable=False)
    nickname = db.Column(db.String(50), nullable=False)
    password = db.Column(db.String(50), nullable=False)

注意,在app.config[‘SQLALCHEMY_DATABASE_URI’] = 'mysql+pymysql://username:password@localhost/db_name’中要将对应的数据库用户名、密码、地址、表名换成自己数据的真实信息。

编写 routers.py 路由模块

在 routers.py 文件中,编写用户列表、新增用户、删除用户接口

# routers.py
from flask import Blueprint, render_template,request,redirect,url_for,jsonify
from config import db,User  # 导入应用工厂函数中初始化的 SQLAlchemy 实例

bp = Blueprint('main', __name__)

@bp.route('/')
def index():
    # 打开数据库连接
    db.create_all()

    # 查询所有用户
    users = User.query.all()

    # 关闭数据库连接
    db.session.close()
   
    return render_template('users.html',users=users)

@bp.route('/add',methods=['GET'])
def add():
    return render_template('addUser.html')

@bp.route('/add_user', methods=['POST'])
def add_user():
    # 打开数据库连接
    db.create_all()

    # 获取请求数据
    data = request.get_json()
    username = data.get('username')
    nickname = data.get('nickname')
    password = data.get('password')

    # 创建新用户
    new_user = User(username=username, nickname=nickname, password=password)
    print(new_user)
    db.session.add(new_user)
    db.session.commit()

    # 关闭数据库连接
    db.session.close()

    return 'User added successfully'
    # return redirect(url_for('main.index'))

@bp.route('/del_user', methods=['POST'])
def del_user():
    # 打开数据库连接
    db.create_all()

    # 获取请求数据
    data = request.get_json()
    username = data.get('username')
    user = User.query.filter_by(username={username}).first()
    print(user)

    if user:
        # 删除用户
        db.session.delete(user)
        db.session.commit()

        # 关闭数据库连接
        db.session.close()
        return 'User added successfully'
        # return redirect(url_for('main.index')) 在
    else:
        return 'User not found'

def init_routes(app):
    app.register_blueprint(bp)

这里我使用了 Blueprint 编写路由,便于后期项目管理,也可以不使用。注意,在 Blueprint 中要实现路由跳转,需要写return redirect(url_for('main.index')),如果写成return redirect(url_for('index'))将无法跳转。

用户列表 html 页面

用户列表页面:users.html代码如下

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>用户列表</title>
</head>
<body>
    <h2>用户列表</h2>
    <ul>
        {% for user in users %}
        <li>{{user.username}}-{{user.nickname}} <button onclick="delUser('{{user.username}}')">删除用户</button></li>
        {% endfor %}
    </ul>
    <a href="http://localhost:5000/add">新增用户</a>

    <script>
        function delUser(username) {
            fetch('/del_user', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ username: username })
            }).then(response => {
                console.log(response);
                if (response.ok) {
                    // 请求成功,重定向到首页,从而刷新页面
                    window.location.href = '/';
                } else {
                    alert('删除用户失败');
                }
            })
        }
    </script>

</body>
</html>
新增用户 html 页面

新增用户页面:addUser.html代码如下

<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <form>
        <h2>新增用户</h2>
        <table>
            <tr>
                <td>Username</td>
                <td><input type="text" name="username" id="username"></td>
            </tr>
            <tr>
                <td>Nickname</td>
                <td><input type="text" name="nickname" id="nickname"></td>
            </tr>
            <tr>
                <td>Password</td>
                <td><input type="password" name="password" id="password"></td>
            </tr>
            <tr>
                <td><button onclick="addUser()">提交</button></td>
            </tr>
            <tr>
                <td><a href="http://localhost:5000/">查看用户列表</a></td>
            </tr>
        </table>
    </form>

    <script>
        function addUser() {
            var username = document.getElementById('username').value;
            var nickname = document.getElementById('nickname').value;
            var password = document.getElementById('password').value;
            var data = {
                username: username,
                nickname: nickname,
                password: password
            };
            if (username && nickname && password) {
                fetch('/add_user', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(data)
                }).then(response => {
                    if (response.ok) {
                        alert('新增用户成功');
                        // 请求成功,重定向到首页,从而刷新页面,视需求而定
                        // window.location.href = '/';
                    } else {
                        alert('新增用户失败');
                    }
                })
            } else {
                alert('请输入表单信息');
            }
        }
    </script>
</body>
</html>
编写 main.py 主程序

最后,在主程序 main.py 中,引入对应模块,并注入app中

# main.py
from config import create_app, db
from routes import init_routes

# 调用应用工厂函数创建应用实例
app = create_app()

init_routes(app)

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

运行,预览效果

运行 main.py 文件,可以看到

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

2024第二届智慧教育和人类发展国际会议(ICSEHD2024)

2024第二届智慧教育和人类发展国际会议(ICSEHD2024) 会议简介 智慧教育对于提升教育质量、促进教育公平、推动教育现代化和数字化转型、培养创新人才以及推动教育理论的发展都具有重要的意义&#xff0c;对人类发展产生着深远的影响&#xff0c;人类发展是智慧教育的最终目的…

Weblogic 任意文件上传漏洞(CVE-2018-2894)

1 漏洞描述 CVE-2018-2894漏洞存在于Oracle WebLogic Server的Web服务测试页面&#xff08;Web Service Test Page&#xff09;中。这个页面允许用户测试Web服务的功能&#xff0c;但在某些版本中&#xff0c;它包含了一个未经授权的文件上传功能。攻击者可以利用这个漏洞&…

uni-app跨端兼容

1.样式兼容 小程序端不支持*选择器&#xff0c;可以使用&#xff08;view,text&#xff09; 页面视口差异(tabar页、普通页) H5端默认开始scoped 例如骨架屏样式出现问题&#xff0c;需要将之前的样式拷贝到骨架屏中 提示&#xff1a;H5端是单页面应用&#xff0c;scoped隔离…

实训八:使用jQuery技术实现企业信息展示系统的相关功能

实训八:使用jQuery技术实现企业信息展示系统的相关功能 1.题目 使用jQuery技术实现企业信息展示系统的相关功能。 2.目的 (1)掌握jQuery的基本知识。 (2)掌握jQuery的应用方法。 (3)进一步理解Ajax程序的设计方法。 (4)会利用所学知识设计简单的应用程序。 3.内容 用jQuery技术…

轴承制造企业“数智化”突破口

轴承是当代机械设备中一种重要零部件。它的主要功能是支撑机械旋转体&#xff0c;降低其运动过程中的摩擦系数&#xff0c;并保证其回转精度。轴承是工业核心基础零部件&#xff0c;对国民经济发展和国防建设起着重要的支撑作用。 轴承企业普遍采用以销定产的经营模式&#xf…

基于TRIZ理论为可穿戴设备创造更好的用户体验

从智能手表到健康监测器&#xff0c;这些小巧而强大的设备正逐渐改变着我们的生活方式。然而&#xff0c;用户体验的优劣直接影响着可穿戴设备的市场接受度和用户黏性。在这样的背景下&#xff0c;基于TRIZ理论&#xff08;发明问题解决理论&#xff09;的创新思维和方法论&…

抖音直播视频怎么录屏

要录制手机直播视频&#xff0c;您需要按照以下步骤进行操作&#xff1a; 1. 打开录屏软件&#xff1a;首先&#xff0c;在您的手机中打开您已经安装好的录屏软件。不同的录屏软件设置方式不同&#xff0c;请根据实际情况进行操作。 2. 调整设置&#xff1a;根据录屏软件的使用…

【深度学习】实验3 特征处理

特征处理 python 版本 3.7 scikit-learn 版本 1.0.2 1.标准化 from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import MinMaxScaler from matplotlib import gridspec import numpy as np import matplotlib.pyplot as plt cps np.random.…

【生信技能树】拿到表达矩阵之后,如何使用ggplot2绘图系统绘制箱线图?

拿到表达矩阵之后&#xff0c;如何使用ggplot2绘图系统绘制箱线图&#xff1f; 目录 预备知识 绘制箱线图示例 预备知识 1.pivot_longer函数 pivot_longer 是tidyr包中的一个函数&#xff0c;用于将数据框&#xff08;data frame&#xff09;从宽格式转换为长格式。在宽格…

AI游戏外挂为何违法?

尊敬的读者们&#xff0c;大家好&#xff01;今天我想和大家探讨一个备受争议的话题——AI游戏外挂的合法性。近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI外挂逐渐成为游戏领域的一大毒瘤。那么&#xff0c;为什么AI游戏外挂会被视为违法行为呢&#xff1f;本…

inline和static底层浅析

找一段代码来底层分析 #include<iostream> using namespace std;inline int add(int a, int b) {return a + b

【Java】入门

笔者是在C语言基础上学习java 安装Java的过程中我们可能会见到这样几个东西&#xff0c;JVM、JRE、JDK&#xff0c;那它们的关系是怎样的呢&#xff1f; -JVM Java Virtual Machine 是Java虚拟机&#xff0c;Java程序需要运行在虚拟机上&#xff0c;不同的平台有自己的虚拟机…

Hack The Box-SolarLab

总体思路 SMB获取敏感信息->CVE-2023-33733漏洞注入->CVE-2023-32315->敏感信息泄露 信息收集&端口利用 nmap -sSVC -p1-10000 10.10.11.16发现目标开放了80、135、139、445和6791端口&#xff0c;并且对应的端口也给出了重定向的标志&#xff0c;将域名加入到…

MySQL学习3

目录 一.合计/统计函数&#xff1a; 1.合计函数--count&#xff1a; 2.合计函数-sum 3.合计函数-avg 4.合计函数--max/min 二.分组统计&#xff1a; &#xff08;1&#xff09;使用group by子句对列进行分组&#xff1a; &#xff08;2&#xff09;使用having子句对分组…

Linux下Telemac-Mascaret源码编译安装及使用

目录 软件介绍 基本依赖 其它可选依赖 一、源码下载 二、解压缩 三、编译安装 3.1 修改环境变量设置文件 3.2 修改配置文件 3.3 编译安装 四、算例运行 软件介绍 TELEMAC-MASCARET是法国电力集团(EDF)的法国国立水利与环境实验室开发的一款研究水动力学和水文学领域的…

0509BBQ的Maven项目

0509BBQ的Maven项目包-CSDN博客 数据库字段 登录界面 点餐主页 登录完成进入点餐主页&#xff0c;显示已点餐的数据 点击点餐按钮&#xff0c;生成对应订单数据。 取消勾选点餐按钮&#xff0c;删除对应订单数据。 点击加减图片&#xff0c;实现对数量的加减 展示订单 ajax动态…

嵌入式学习67-C++(多线程,自定义信号合槽,串口通信)

知识零碎&#xff1a; GPS传感器获取到的 经纬度信息并不是真实的物理坐标&#xff0c;还需要转换 signals&#xff1a; …

Dread Hunger 海上狼人杀服务器开服教程

1、购买后登录服务器&#xff0c;百度莱卡云 1.1、第一次购买服务器会安装游戏端&#xff0c;大约5分钟左右&#xff0c;如果长时间处于安装状态请联系客服 2、创建端口 点击网络创建第二个端口作为副端口&#xff08;副端口的作用是用于第二局游戏&#xff0c;因为游戏BUG&am…

Android 老年模式功能 放大字体

1 配置属性 <attr name"text_size_16" format"dimension"/><attr name"text_size_18" format"dimension"/><attr name"text_size_14" format"dimension"/><attr name"text_size_12&quo…

作为有伦敦金交易技巧的人,最后都怎么样了?

伦敦金投资者如果不懂技术分析&#xff0c;就好比航海家看不懂地图&#xff0c;钢琴家看不懂五线谱。掌握一些常用而有效的分析技巧&#xff0c;可以帮助伦敦金投资者更好地预测市场走势&#xff0c;做出更明智的投资决策...... 对于新手伦敦金投资者来说&#xff0c;学习如何识…