轻量级Web框架Flask

news2025/1/18 8:41:34

Flask-SQLAlchemy

MySQL是免费开源软件,大家可以自行搜索其官网(https://www.MySQL.com/downloads/)

测试MySQL是否安装成功

在所有程序中,找到MySQL→MySQL Server 5.6下面的命令行工具,然后单击输入密码后回车,就可以知道MySQL数据库是否链接成功。

右击桌面上的“计算机”,在弹出的快捷键菜单中选择“属性”|“高级系统设置”|“环境变量”,在path里面添加MySQL bin目录的路径。选择环境变量,在环境变量中的path路径下输入你的MySQL路径就行了。默认安装的路径是C:\MySQL\MySQL Server 5.6\bin

安装flask-sqlalchemy,安装不了就更换豆瓣源

1

pip install flask-sqlalchemy

 对象-关系映射实质

复制代码

class  Lib_card(db.Model):
    __tablename__ = 'lib_card'
    id = db.Column(db.Integer, primary_key=True, comment='id号')
    card_id = db.Column(db.Integer, nullable=False, comment = '借书证')
    book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
    books = db.relationship('Book', backref=db.backref('cards'),uselist=False)

复制代码

在Flask-SQLAlchemy中,插入、修改、删除操作均由数据库会话管理

需要一个配置config.py

复制代码

USERNAME= 'root'                                        #设置登录账号
PASSWORD= '930103'                                        #设置登录密码
HOST= '127.0.0.1'                                        #设置主机地址
PORT= '3306'                                                #设置端口号
DATABASE= 'demo1'                                #设置访问的数据库
SQLALCHEMY_DATABASE_URI= f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'#创建数据库连接示例
#动态追踪修改设置,如未设置只会提示警告
SQLALCHEMY_TRACK_MODIFICATIONS=False
#查询时会显示原始SQL语句
SQLALCHEMY_ECHO= True

复制代码

实例

复制代码

from datetime import datetime

from flask import Flask                                                        #导入Flask模块
from flask_sqlalchemy import SQLAlchemy               #导入SQLAlchemy模块
import config                                                                 #导入配置文件
app= Flask(__name__)                                                        #Flask初始化
app.config.from_object(config)                                        #配置文件实例化
#初始化一个对象
db=SQLAlchemy(app)

class Book(db.Model):
    __tablename__ = 'book'
    id = db.Column(db.Integer, primary_key = True,comment='id号')
    title = db.Column(db.String(50), nullable=False,comment='书名')
    publishing_office = db.Column(db.String(100), nullable=False,comment='出版社')
    isbn = db.Column(db.String(100), nullable=False, comment='isbn号')
    storage_time = db.Column(db.DateTime, default=datetime.now(), comment='入库时间')

class  Lib_card(db.Model):
    __tablename__ = 'lib_card'
    id = db.Column(db.Integer, primary_key=True, comment='id号')
    card_id = db.Column(db.Integer, nullable=False, comment = '借书证')
    book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
    books = db.relationship('Book', backref=db.backref('cards'),uselist=False)

with app.app_context():
#测试数据库连接是否成功
    db.create_all()     #创建数据库
    # book1= Book(id=9,title='智能导论', publishing_office='高等教育出版社',isbn='9787040479844')
    # db.session.add(book1)
    # db.session.commit()
    # result = Book.query.filter(Book.id == 9).first()
    # print(result.title)
    # agine = Book.query.filter(Book.title == result.title).all()
    # for i in agine:
    #     print(i.id)
    # db.session.delete(result)
    # db.session.commit()
    # card1=Lib_card(card_id='18001', book_id='8')
    # card2=Lib_card(card_id='18002', book_id='8')
    # db.session.add(card1)
    # db.session.add(card2)
    # db.session.commit()
    book_query = Book.query.filter(Book.id == 9).first()
    lib_card_query = book_query.cards
    for i in lib_card_query:
        print(i.card_id)

@app.route('/')
def index():
    return 'index'

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

复制代码

注意:一个表(模型)的定义必须要定义一个主键,这个主键一般为id。在定义了Lib_card类后,申明了一个外键,并且在relationship方法中使用uselist=False来约束其关系。book_id =db.Column(db.Integer,db.ForeignKey('book.id'))表示创建一个外键,类型要跟主表一样,通过db.ForeignKey("user.id")与主表绑定books =db.relationship('Book',backref=db.backref('cards');uselist=False)表示Book可以根据Lib_card中的借书证查找到book表中的信息,backref="cards"表示book表可以直接通过cards查找到该书下的借书证号码。

框架实例

建一个apps文件夹,添加一个admin包,admin包下创建三个py文件

#__init__.py
#预加载模块内容
#其他地方调用的时候 可以直接from apps.admin import bp as admin_bp不用找到views
from .views import bp

复制代码

#forms.py
from flask_wtf import FlaskForm
from wtforms import *
from wtforms.validators import *

class NameForm(FlaskForm):
    username = StringField('用户名',validators=[DataRequired()])
    password = PasswordField('密码',validators=[DataRequired()])
    submit = SubmitField('提交')

复制代码

复制代码

#models.py
from exts import db

class User(db.Model):
    __tablename__ = 'jq_user'
    uid = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), nullable=False, comment="用户名")
    password = db.Column(db.String(100), nullable=False,comment="密码")
    email = db.Column(db.String(50), nullable=False, unique=True, comment = "邮箱")

复制代码

复制代码

#views.py
from flask import Blueprint, request, flash, render_template
from apps.admin.forms import NameForm
from apps.admin.models import User

bp = Blueprint("admin",__name__)

@bp.route("/admin",methods=['GET','POST'])
def index():
    form = NameForm()
    if request.method == 'POST':
        if form.validate_on_submit():
            username = request.form.get('username')
            password = request.form.get('password')
            result = User.query.filter(User.username==username).first()
            if result and password == result.password:
                flash('登录成功')
            else:
                return render_template('login.html', form=form, errormsg="登陆失败")
    return render_template('login.html', form=form)

复制代码

建一个文件夹templates,专门放login.html文件,通过render_template调用

复制代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <h1>用户注册登录</h1>
    <form method="post" action="/test/admin">
        {{ form.csrf_token()}}
        {{ form.username.label }}{{ form.username}}
        {{ form.password.label }}{{ form.password}}
        {{ form.submit }}{{errormsg}}

        {% for message in get_flashed_messages() %}
            {{ message }}
        {% endfor %}
    </form>
</head>
<body>

</body>
</html>

复制代码

建一个app.py

复制代码

from flask import Flask
from apps.admin import bp as admin_bp
from exts import db
from apps.common import bp as common_bp
from apps.front import bp as front_bp
from apps.admin.models import User
from apps.common.models import Book


def create_app():
    app = Flask(__name__)
    app.secret_key = '123321'
    #注册蓝图,注册时候可以设置前缀
    app.register_blueprint(admin_bp,url_prefix="/test")
    app.register_blueprint(common_bp)
    app.register_blueprint(front_bp)
    app.config.from_object('config')
    # db.app = app
    db.init_app(app)
    return app



if __name__ == '__main__':
    app = create_app()
    with app.app_context():
        db.create_all()
    app.run(host="127.0.0.1",port=1314,debug=True)

复制代码

建一个config.py

复制代码

DEBUG=True
USERNAME= 'root'                                        #设置登录账号
PASSWORD= '930103'                                        #设置登录密码
HOST= '127.0.0.1'                                        #设置主机地址
PORT= '3306'                                                #设置端口号
DATABASE= 'demo1'                                #设置访问的数据库
SQLALCHEMY_DATABASE_URI= f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'#创建数据库连接示例
#动态追踪修改设置,如未设置只会提示警告
SQLALCHEMY_TRACK_MODIFICATIONS=False
#查询时会显示原始SQL语句
SQLALCHEMY_ECHO= True

复制代码

建一个exts.py

#encoding:utf-8
from flask_sqlalchemy import SQLAlchemy
db=SQLAlchemy() 

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

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

相关文章

Scratch 之 TurboWarp 常用插件介绍-2

今天带来2篇 TurboWarp 常用插件介绍 什么你还没有 TurboWarp &#xff1f; 快去下载一个吧 TurboWarp&#xff08;简称TW&#xff09; 在线版 | 离线版下载 TurboWarp优点 编译速度快于原版 Scratch 至少10倍拥有自定义帧的功能&#xff08;比如60 FPS&#xff09;造型编…

【网络基础实战之路】基于三个分公司的内网搭建并连接运营商的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

云计算——存储虚拟化简介 与 存储模式及方法

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前期回顾 前言 一.存储虚拟化介绍 1.云计算存储基本概念 2.云计算存储模型 3.创…

小米基于 Flink 的实时计算资源治理实践

摘要&#xff1a;本文整理自小米高级软件工程师张蛟&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分&#xff1a; 1. 发展现状与规模 2. 框架层治理实践 3. 平台层治理实践 4. 未来规划与展望 Tips&#xff1a;点击「阅读原文」免费领取…

客户端渲染和服务端渲染的区别

一、客户端渲染 页面的渲染工作都是由浏览器来完成的&#xff0c;服务器只是负责提供数据。前端去后端取数据生成DOM树。 **最少两次请求 ** 第一次请求拿到的是页面第二次请求拿到的是动态数据 二、服务端渲染 页面渲染的工作都是由服务端来完成的&#xff0c;数据也是由服…

# X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系

X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系 很多人对于他们是啥是傻傻分不清的&#xff0c;我做了个表格供大家参考。 摘抄&#xff1a; X11是X Window System Protocol, Version 11&#xff08;RFC1013&#xff09;&#xff0c;是X server和X client之间的通…

Maven进阶1 -- 分模块开发、依赖管理、聚合与继承、属性、版本管理、多环境开发、跳过测试

目录 1.分模块开发 将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间的相互调用&#xff0c;接口共享。 案例&#xff1a;拆分一下这个SSM整合案例 ①创建maven模块 demo项目下的pom.xml文件&#xff08;主要看一下依赖&#xff09; <dependencies><!…

ApplicationContextInitializer

目录 在何处执行&#xff1f;何时初始化&#xff1f;自己写一个ApplicationContextInitializer 那这个类的设计具体有什么作用呢&#xff1f;&#xff1f;1. DelegatingApplicationContextInitializer2. SharedMetadataReaderFactoryContextInitializer3. ContextIdApplication…

试卷扫描去掉痕迹,这个工具很好用

随着科技的不断发展&#xff0c;试卷扫描越来越普及&#xff0c;成为了现代教育不可或缺的一部分。试卷扫描的优势在于可以快速高效地批改试卷&#xff0c;但试卷上的痕迹往往会干扰扫描的准确性。如果可以扫描试卷并将上面填写的答案内容擦除还可以针对打错的题目重新巩固&…

【Rust】Rust学习 第八章常见集合

Rust 标准库中包含一系列被称为 集合&#xff08;collections&#xff09;的非常有用的数据结构。大部分其他数据类型都代表一个特定的值&#xff0c;不过集合可以包含多个值。不同于内建的数组和元组类型&#xff0c;这些集合指向的数据是储存在堆上的&#xff0c;这意味着数据…

mybatis-flex探索

mybatis古今未来 最近无意之中发现了一个非常棒的持久层框架mybatis-flex&#xff0c;迫不及待研究了一下 发现简直就是我的梦中情框&#xff0c;之前写ibatis&#xff0c;后来写mybatis&#xff0c;接着写mybatis-plus&#xff0c;接着研究mybatis-flex ibatis ibatis是apa…

ssm在线医疗服务系统源码和论文PPT

ssm在线医疗服务系统源码和论文PPT003 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 选题意义、价值和目标&#xff1a; 随着经济的迅速发展,人们对生活水平和身体健康的要…

chatGPT应用于房地产行业

作为 2023 年的房地产专业人士&#xff0c;您无疑认识到技术对行业的重大影响。近年来&#xff0c;一项技术进步席卷了世界——人工智能。人工智能彻底改变了房地产业务的各个方面&#xff0c;从简化管理任务到增强客户互动。 在本文中&#xff0c;我们将探讨几种巧妙的人工智…

工业互联网发展在即 博晨(BOCHEN)攻克“卡脖子”难题

5G时代的到来&#xff0c;正在悄然掀起一场智能化技术改革的风暴。工业互联网未来一定要走向制造智能化&#xff0c;这可能是我们未来工业互联网推动工业系统新生态的核心问题。”中国电子信息行业联合会专家委员会主任董云庭就曾表示。目前&#xff0c;工业互联网已经覆盖至国…

DC电源模块在工业控制器中的重要性

BOSHIDA DC电源模块在工业控制器中的重要性 DC电源模块在工业控制器中起着非常重要的作用&#xff0c;它是实现工业控制器运转所必需的组成部分。 DC电源模块主要用于将交流电转换成直流电供给工业控制器中的各个部件&#xff0c;包括控制器内部的微处理器、传感器、执行器等等…

【C++】五分钟带你搞懂深浅拷贝

目录 拷贝函数 浅拷贝拷贝构造函数 深拷贝拷贝构造函数 总结 前言 前面我们学习了C的一些基本的知识点&#xff0c;并且介绍了一些STL里面String的一些关键操作&#xff0c;除了这些博主还新开了一个专栏关于Linux的讲解&#xff08;Linux专栏链接&#xff09;大家可以关注…

Redis-简单动态字符串(SDS)

文章目录 文章概要SDS数据结构定义SDS和C字符串的区别总结参考 文章概要 本篇文章&#xff0c;我们来学习Redis字符串的编码格式SDS编码&#xff0c;文章将将从以下几个方面介绍SDS&#xff1a; SDS的底层数据结构定义Redis是C写的&#xff0c;那SDS和C中的字符串的区别是什么…

勒索软件野蛮生长,迷雾中企业何去何从

根据GRIT最新发布的勒索软件报告显示&#xff0c;今年二季度观测到的勒索软件事件数量明显多于一季度&#xff0c;而导致这一情况的三大原因分别为&#xff1a;漏洞的大规模利用、勒索软件工具技术的“民主化”以及新兴勒索软件组织的野蛮生长。 报告公布了2023年最活跃最多产的…

第9集丨Vue 江湖 —— 监测数据原理

目录 一、修改数据时的一个问题1.1 现象一1.2 现象二 二、Vue监测数据原理2.1 模拟一个数据监测2.2 数据劫持2.3 Vue.set()/vm.$set()2.4 基本原理2.4.1 如何监测对象中的数据?2.4.2 如何监测数组中的数据?2.4.3 修改数组中的某个元素 2.5 案例2.5.1 需求功能2.5.2 实现 一、…

【深度学习 video detect】Towards High Performance Video Object Detection for Mobiles

文章目录 摘要IntroductionRevisiting Video Object Detection BaselinePractice for Mobiles Model Architecture for MobilesLight Flow 摘要 尽管在桌面GPU上取得了视频目标检测的最近成功&#xff0c;但其架构对于移动设备来说仍然过于沉重。目前尚不清楚在非常有限的计算…