从零开始用 Flask 搭建一个网站(二)

详解如何使用 DosBox 安装 Windows 95 操作系统 其实博主最近想更的博文不是这个,原是想分享一个自己写的油猴插件帮助某网学员去绕过该网站限制拖在线课件及录播视频到本地保存的,但是,期间博主又动了重温经典游戏(博主想玩的游戏主要是生化危机、玩具兵大战、剑侠情缘等)的念头,此前想要通过虚拟机玩游戏的想法始终难以得偿,毕竟VMWare Workstation对Windows 98的支持简直差到令人发指,NVIDIA GRID又不是个人能玩得起的东西... 阅读详情

从零开始用 Flask 搭建一个网站(一) 介绍了如何搭建 Python 环境,以及 Flask 应用基本项目结构。我们要搭建的网站是管理第三方集成的控制台,类似于 Slack。 本篇主要讲解数据如何在 Flask 应用中流动,其它的框架基本上也是大同小异。

数据库

既然是数据的流动,首先要建立起存取数据的地方,也就是数据库了(这里是指关系型数据库,NoSQL 不在这讨论)。第一节中我们使用了 Flask-SQLAlchemy 管理数据库,在 Flask-SQLAlchemy 中,数据库使用 URL 指定,最流行的数据库 URL 格式如下:

数据库引擎URL
MySQLmysql://username:password@hostname/database
Postgrespostgresql://username:password@hostname/database
SQLite(Unix)sqlite:////absolute/path/to/database
SQLite(Windows)sqlite:///c:/absolute/path/to/database

在 config.py 中我们已经指定了数据库 URL,如果使用云平台部署程序,直接将生成的数据库 URL 写到 config.py 中 SQLALCHEMY_DATABASE_URI 即可。这里我们使用的是 SQLite 数据库。Flask-SQLAlchemy 采用数据库抽象层来操作数据库,也称为对象关系映射(Object-Relational Mapper, ORM),在用户不知不觉的情况下把高层的面向对象操作转换成低层的数据库指令,因此易用性好。我们已经在 app/__init__.py 中实例化了 SQLAlchemy 类:

app/__init__.py

from flask_sqlalchemy import SQLAlchemy
...
db = SQLAlchemy()
...
定义模型

模型类可以理解为数据库中的一张表,Flask-SQLAlchemy 提供了一个基类和一系列辅助类和函数来让我们定义模型的结构。我们直接在 app 文件夹下创建一个 models.py 文件。鉴于每个网站需求都不一样,所存的数据也不同,但本质上是大同小异的。这里以笔者网站需求为例,需要创建 Developer,Integration 和 Channel 三个表。

app/models.py 部分代码

from flask import current_app
from app import db

class Developer(db.Model):    
    __tablename__ = 'developers'    
    id = db.Column(db.Integer, primary_key=True)    
    dev_key = db.Column(db.String(40), unique=True, index=True)    
    platform = db.Column(db.String(50))    
    platform_id = db.Column(db.String(40), unique=True)    
    username = db.Column(db.String(150), index=True)    
    integrations = db.relationship('Integration', backref='developer')    
    channels = db.relationship('Channel', backref='developer')

class Integration(db.Model):    
    __tablename__ = 'integrations'    
    id = db.Column(db.Integer, primary_key=True)    
    integration_id = db.Column(db.String(40), unique=True)    
    name = db.Column(db.String(100))    
    description = db.Column(db.String(150))    
    icon = db.Column(db.String(150))    
    channel = db.Column(db.String(150))    
    token = db.Column(db.String(150))    
    developer_id = db.Column(db.Integer, db.ForeignKey('developers.id'))

class Channel(db.Model):    
    __tablename__ = 'channels'    
    id = db.Column(db.Integer, primary_key=True)    
    developer_id = db.Column(db.Integer, db.ForeignKey('developers.id'))    
    channel = db.Column(db.String(150))    

    def __repr__(self):        
        return '<Channel %r>' % self.channel

上面的每个 Class 都继承了 Model 类,因此每个类在数据库中都体现为一张表,表名用 __tablename__ 表示,一般用复数形式。这里主要讲一下一对多的关系。可以看到上面 Developer 和 Integration 及 Channel 都有一个一对多的关系,一个用户可以有多个集成及多个频道。 看到这两句:

integrations = db.relationship('Integration', backref='developer')
developer_id = db.Column(db.Integer, db.ForeignKey('developers.id'))

第一句表明添加到 Developer 表的 integrations 属性表示这个关系的面向对象视角,对于一个 Developer 实例,integrations 属性将返回与 Developer 相关的所有 Integration,db.relationship() 第一个参数表明关系的另一端是哪个模型,backref 参数向 Integration 添加一个 developer 属性,从而定义反向关系。第二句是在 Integration 表中创建一个 developer_id 字段,这个字段被定义为外键,就是这个外键建立起了关系。传给 db.ForeignKey() 的参数 ‘developers.id’ 表明这列的值是 developers 表中行的 id 值。另外,__repr__() 方法返回一个具有可读性的字符串表示模型,可以在调试和测试时使用。下面我们就在命令行中操作一下数据库。
首先执行:

//创建 migrations 文件夹及相关文件
python manage.py db init

然后执行 :

//自动创建迁移脚本
python manage.py db migrate
//创建数据表或者升级到最新版本
python manage.py db upgrade

以后模型类有改动,比如删除或添加列,都要执行这两个命令,更新数据库表。现在在项目目录下应该自动生成了名为 dev 的数据库。
接下来执行如下命令进入 Python Shell:

python manage.py shell
创建表

使用 db.create_all() 就可以根据模型类创建表。如图:

使用 db.drop_all() 方法就可以删除所有的表,但是这种方式比较粗暴,所有的数据也一同销毁了。

插入行

以下命令在数据库表中插入了一条数据:

通过数据库会话 db.session 来管理对数据库所做的改动,在准备把对象写入数据库之前,首先要添加到会话中,然后用 commit() 方法提交会话。接下来我们继续插入一条 Integration 数据:

>>>from app.models import Integration,Channel
>>>integration = Integration(integration_id='i0001',name='github',description='first >>>application',channel='github_event',developer=developer)
>>> db.session.add(integration)
>>> db.session.commit()

注意上面的 developer 属性,正是我们在 models.py 中 Developer 模型中定义的一对多关系 integrations 属性的 backref 值, 所谓的反向关系即指在 Integration 表中每条数据都有一个 developer 属性指向 Developer 表中的某条数据,这是一对多关系的高级表示。现在可以用 developer.integrations 来查看该 developer 拥有的哪些集成,运行截图如下:

修改行

在提交数据库会话之前,改变对象的某个属性然后再提交即可更新行数据。如:

>>> developer.username = 'lisi'
>>> db.session.add(developer)
>>> db.session.commit()

运行截图:

删除行

调用 db.session.delete() 方法即可删除行:

>>>db.session.delete(developer)
>>>db.session.commit()
查询行

Flask-SQLAlchemy 为每个模型提供了 query 对象,最基本的查询是返回表中的所有记录:

>>>Developer.query.all()

使用过滤器可以进行更精确的查询:

>>>Developer.query.filter_by(platform='qq').all()

如果你退出了 shell 会话,前面创建的对象就不会以 Python 对象的形式存在,而是作为各自数据库表中的行。这时需要重数据库中读取行,再重新创建 Python 对象,如:

>>> new_developer = Developer.query.filter_by(dev_key=12345).first()

注意上面的 first() 方法,如果不加上,将返回一个 BaseQuery 对象,这样就不能直接用 new_developer 来访问它的属性值。

在视图函数中操作数据库

上面介绍的所有数据库操作可以直接在视图函数中进行。假设我们要做一个简陋的注册功能,下面我们就来看看如何从网页中获取数据并保存在数据库中。我们先定义一个用户模型:

app/models.py

class User(db.model):
    __tablename__ = 'users'
    id = db.column(db.Integer, primary_key=True)
    username = db.column(db.String(50), unique=True)
    password = db.column(db.String(100))

    def __repr__(self):
        return '<User %r>'  % self.username

然后在 main 文件夹下创建一个 forms.py 文件。

app/main/forms.py

from flask_wtf import Form
from wtforms import StringField, SubmitField, PasswordField
from wtforms.validators import DataRequired

class UserForm(Form):      
    username = StringField('Input your username', validators=[DataRequired()])    
    password = PasswordField('Input your password', validators=[DataRequired()])    
    submit = SubmitField('Submit')

我们使用了 flask-wtf 扩展(pip install flask-wtf)来处理表单。
然后我们用在 index 页面中显示这个表单。

index.html

{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}注册{% endblock %}

{% block content %}
    {% for message in get_flashed_messages() %}    
        <div class="alert alert-warning">        
            <button type="button" class="close" data-dismiss="alert">×</button>        
            {{ message }}    
        </div>
    {% endfor %}
    <div id="form">
        <div class="col-md-4">
            {{ wtf.quick_form(form) }}
        </div>
    </div>
{% endblock %}

现在回到 views.py 中,在我们的视图函数中作如下改动:

app/main/views.py

...
from .forms import UserForm
from ..models import User
from app import db


@main.route('/', methods=['GET', 'POST'])
def signin():
    form = UserForm()
    if form is None:
        flash('Should input username and password')
    elif  form.validate_on_submit():
        user = User(username=form.username.data, password=form.password.data)
        db.session.add(user)
        try:
            db.session.commit()
            flash('User created !')
        except:
            db.session.rollback()
            flash('User create failed')
    return render_template('index.html', form=form)

接下来我们运行一下这个小试验:

python manage.py runserver

总结

本节我们介绍了在 Flask 中是如何使用 Flask-SQLAlchemy 、Flask-Migrate来管理数据库,并且示范了数据从网页储存到数据库的过程,这只是最基础的部分,下一节我们将探索如何在网页上发送请求并且得到数据,以及如何在页面之间传递数据。


作者:KenChoi - 极光

原文:从零开始用 Flask 搭建一个网站(二)

知乎专栏:极光日报

windows11专业版 windows11 企业版 LTSC 微软官网下载地址 阿拉伯语 64-bit 97ED2DF27DEBE5A8E94FB37BE4383EB8516D5C24117793BDA5C1E13568D3F754保加利亚语 64-bit 1C1BD6E96290521B7E4F814ACA30C2CC4C7FAB1E3076439418673B90954A1FFC家庭版(仅限中国) 64-bit 47E6049E0EB085C779EC8A2BDE1723CED563CF541E4E49F147725E87DA020753。 阅读详情

相关推荐

Protobuf NDK以及QNX交叉编译

Protobuf 用处很广,尤其是通讯数据序列化,反序列化。TODO。

静虚待令,有物混成 1560

使用 Python 的 flask 架构搭建一个简单web网站

使用flask搭建一个简单web网站 1.flask最简单框架,返回hello world: from flask import * app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__=="__main__": app.run(host='0.0.0.0',port=8080) # 0.0.0.0地址可给本机所有的IP地址访问 我们可以在app路由处的

K_AAbb的博客 4370

《R语言实战》第八章之回归分析图形

回归分析图形 回归分析分为简单回归与复杂回归 1 : 简单线性回归即:模型中只包含一个因变量和一个自变量,有时候也会包含多项式, 这个图形描述了身高与体重的线性关系,这也是一个多项式图形 2:当我们的预测变量(自变量)不止一个时,就属于多元线性回归,而且多元线性回归中也可以包含多项式以及交互项 (1)在进行多远回归分析之前可以先描述变量之间的相关关系 上图为一个散点图矩阵,描述了五个变量之间的相关关系,我们可以通过非主对角线的散点图来查看两个变量之间的关系。 多元线性回归简单地就是OLS回归,通过lm和

Strawberry_Ya的博客 1834

Web开发day1:使用flask快速搭建网站

使用flask简单搭建一个本地网站,介绍部分html语法

m0_56681374的博客 3003

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1190

solidworks vba二次开发配合问题

solidworks vba二次开发配合问题二次开发装配的步骤 二次开发装配的步骤 solidworks可以使用宏录制配合过程从而得到配合的vba代码,步骤如下: 1.选择两个配合的面(点、线等) 2. 建立配合 例如将两个圆柱面同心(图中高亮): 配合后 我们看一下宏录制的代码: Sub main() //激活solidworks接口 Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc //选择两个圆柱面,注意此处是根据坐标选择,不

Alejandro123的博客 3405

【Python应用】爬虫教程:利用python-Flask框架搭建本地数据可视化网站

成果展示: (1)网站首页: (2)电影表单页 (3) 电影评分页 (4) 词频统计页 (5)团队页面 接下来让我们看看上述网站是如何完成的: 首先简单介绍一下Flask框架: Flask主要功能有两个: (1)Werkzeug——路由转换 (2)jinja2——框架渲染 1、环境搭建: 下载python-Flask扩展包 pip install flask 将Flask模块导入程序中: from flask import Flask ..

有朋自远方来,不亦乐乎。 1万+

使用TEA5767和stm32制作一台数字FM收音机

本节我们来使用stm32控制一款集成收音机芯片TEA5767,来制作一台FM收音机。 TEA5767是一款低功耗立体声收音IC,接收频率76MHz~108MHz(适应日本/美国/欧洲各FM频段选择)并可以使用软件进行静音和消除噪音。 主要电性能指标:工作电压:2.5V~5.0V,工作电流10mA,立体声分离度30dB,信噪比60dB,输出信号电平75mV。支持I2C总线通信、3-wire总线。 1)硬件设计 TEA5767芯片外围需要搭配较多的电阻、电容、电感、晶振等器件,而且高频电路的PCB设

小白白学电子 1万+

使用Flask web框架快速搭建一个网站(学习笔记1)

使用flask web框架快速搭建一个网站

qyqyqyi的博客 3355

安卓 实现灯光闪过效果

有个小需求,给按钮加一个灯光划过的效果,这样的需求一般有UI,肯定就找UI了要个gif图不就完事了,可是这次没有,好久自己做一个嘛。Web端的大佬实现很快,到安卓这边呢,百度一搜发现诶?怎么没有,好吧自己来一个 一切动效相关的不给图看都是耍流氓 所以俺不能这么干啊,OK!直接上效果图,再来解释下怎么实现的 效果就是这样子,怎么实现呢? 从图分析下,就是一个光写着重左边移动要右边循环嘛,这有啥难的?? 来看一看我的第一版,第二版 这是个什么?????一点都不像啊? 赶紧再问了问Web端大佬,噢,加了一个

SummerCloudXT的博客 1378

【ARMv9 DSU-120 系列 1 -- DSU-120 DynamIQ 概述】

ARMv9架构中的DynamIQ™ Shared Unit-120(简称DSU-120)为一组基于Cortex-A类架构的核心提供了共享的L3内存系统、窥探控制(snoop control)和 过滤(filtering) 以及其他支持集群运作的控制逻辑。这个集群被称为DSU-120 DynamIQ™集群。此外,所有连接到片上系统(SoC)的外部接口也都是通过DSU-120提供的。一个DSU-120 DynamIQ™集群可以包含1到14个核心,且同一集群中可包含多达三种不同类型的核心。

CodingCos的博客 1185

Python进阶教程丨使用Flask搭建你的个人网站

当我第一次需要搭建一个网站后端服务时,Django庞大的体系让我望而生畏,而则像一阵清风,让我惊讶于它的简洁与优雅。仅仅几行代码,一个功能完备的web服务就能运行起来。正是这种"提供你需要的,不强加你不需要的"的设计理念,让Flask在Python Web框架中独树一帜。今天,我们将深入探索Flask的核心原理、工作机制和应用实践,让你真正理解这个"微框架"的强大魅力。

2301_78095812的博客 1639

使用VNA(Vector Network Analyzer)对S参数进行去嵌(一)

传统上,RF和微波组件被设计成具有同轴接口的封装。通过连接一系列这些单独的同轴设备,可以容易地制造复杂的系统。使用使用类似同轴接口的标准测试设备可以很容易地测量这些部件和系统的性能。然而,现代系统需要更高水平的组件集成、更低的功耗和更低的制造成本。射频组件正在迅速从使用昂贵同轴接口的设计转向使用印刷电路板和表面贴装技术(SMT)的设计。传统的同轴接口甚至可以从最终产品中取消。这就给设计者留下了用需要同轴接口的测试设备测量这些射频和微波组件性能的问题。解决方案是使用连接同轴和非同轴传输线的测试夹具。

小孟同学的博客 1万+

Windows95 VMWare虚拟机文件下载说明

Windows95 VMWare虚拟机文件下载说明 【下载地址】Windows95VMWare虚拟机文件下载说明 这是一个预先配置好的Windows95系统VMWare虚拟机文件,包含已安装并克隆完成的Windows95操作系统,下载后可直接在VMware中打开使用。系统已完成了网络和显示卡设置,无需额外配置,省去了繁琐...

gitblog_06734的博客 687

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【免费下载】 重温经典:Windows 95 下载资源推荐

重温经典:Windows 95 下载资源推荐 【下载地址】Windows95下载资源介绍分享 Windows 95 下载资源介绍本资源文件提供了Windows 95操作系统的下载链接,适用于对历史操作系统感兴趣的用户或需要进行特定测试的开发者 ...

gitblog_06510的博客 5497

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Windows 各版本下载

Windows 各版本官方下载。

StudyOgre的博客 3759

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【亲测免费】 Windows 95 下载资源介绍

Windows 95 下载资源介绍 【下载地址】Windows95下载资源介绍分享 Windows 95 下载资源介绍本资源文件提供了Windows 95操作系统的下载链接,适用于对历史操作系统感兴趣的用户或需要进行特定测试的开发者 ...

gitblog_06592的博客 1686

Windows 95 下载

Windows 95 下载 简介: 1995年8月24日,微软公司推出了Windows 95,它是第一个不要求先安装DOS的32位操作系统。Windows 95的大部分内核代码都重新改写,虽然仍有部分16位代码(如USER.EXE和GDI.EXE)存在于Windows 95之中,但大多数代码是32位的。Windows 95的大多数1/0操作、存储管理和进程管理是保护模式的。但所有的Window...

StudyOgre的博客 1万+

React95 教程:Windows 95 风格组件库

React95 是一个基于 React 的组件库,它复刻了经典的 Windows 95 操作系统的界面风格。如果你怀念那个时代的 UI 设计,或者想要为你的现代应用程序添加一点复古风味,React95 可能是一个不错的选择。该项目提供了一系列 UI 组件,如按钮、输入框、菜单等,可帮助开发者轻松构建具有 Win95 风格的用户界面。 ## 2. 项目快速启动 要开始使用 React95,首先确...

gitblog_00361的博客 512

Windows95OSR2中文版资源下载介绍:怀旧经典,重现历史风采

Windows95OSR2中文版资源下载介绍:怀旧经典,重现历史风采 【下载地址】Windows95OSR2中文版资源下载介绍 Windows 95 OSR2 中文版,也被称为PWIN97,是一款承载着无数人回忆的经典操作系统。它以稳定的性能和简洁的界面著称,特别适合在全新电脑上安装使用。该版本为OSR2,专为中文用户优...

gitblog_06706的博客 1595

终极指南:如何用React95快速构建Windows 95风格应用

React95是一个基于React的开源组件库,专门为现代Web应用提供经典的Windows 95风格UI组件。如果你怀念90年代的计算机界面,或者想为你的项目添加一抹复古风味,React95提供了完美的解决方案。这个库包含了按钮、窗口、菜单、输入框等40多个精心设计的组件,让开发者能够轻松构建具有怀旧感的用户界面。 [![React95复古像素风格logo](https://raw.gitco

gitblog_00495的博客 371

React95:复古Windows 95 UI组件库

React95 是一个受到 Windows 95 用户界面设计启发的开源组件库。它旨在通过一系列复古风格的组件,让开发者能够轻松构建出类似90年代经典Windows操作系统的界面。这个项目不仅是对复古风格的致敬,也为现代Web应用带来了独特的视觉体验。 ## 项目技术分析 React95 基于React技术栈构建,利用现代前端框架的灵活性,重新诠释了Windows 95的经典设计。它包含多个子

gitblog_00126的博客 503

终极复古指南:如何用React95打造Windows 95风格的现代网页应用

还在怀念那个经典的Windows 95界面吗?现在,你可以通过React95这个神奇的React组件库,将复古的Win95风格完美融入到现代网页应用中!React95是一个专门为React开发者设计的Windows 95风格UI组件库,它让你轻松构建具有经典操作系统美学的用户界面。 ## 🎯 为什么选择React95?复古UI的独特魅力 在当今扁平化设计盛行的时代,复古风格的UI反而能带来独

gitblog_00928的博客 337

【亲测免费】 重温经典:Win95.CSS 带你回到 Windows 95 时代

你是否还记得那个经典的 Windows 95 界面?那个充满怀旧感的按钮、卡片和图标,仿佛带着我们回到了那个互联网刚刚兴起的年代。现在,通过 **Win95.CSS**,你可以轻松地将你的 Bootstrap 网站打造成一个充满复古风情的 Windows 95 风格界面。 ## 项目介绍 **Win95.CSS** 是一个开源项目,旨在将现代的 Bootstrap 4 框架与经典的 Windo

gitblog_00212的博客 1418

Windows 95 OSR2 中文版资源下载介绍

Windows 95 OSR2 中文版资源下载介绍 【下载地址】Windows95OSR2中文版资源下载介绍 Windows 95 OSR2 中文版,也被称为PWIN97,是一款承载着无数人回忆的经典操作系统。它以稳定的性能和简洁的界面著称,特别适合在全新电脑上安装使用。该版本为OSR2,专为中文用户优化,提供了良好的本...

gitblog_06752的博客 913

React95项目入门指南:打造复古Windows95风格应用

React95是一个基于React的UI组件库,专门用于创建具有经典Windows95操作系统风格的现代化Web应用。这个库完美复刻了90年代Windows系统的视觉元素,包括按钮、菜单、对话框等组件,让开发者能够轻松构建怀旧风格的界面。 ## 安装步骤 ### 前置准备 在开始使用React95之前,确保你的开发环境中已经配置好以下内容: - Node.js运行环境(建议使用LTS版本) ...

gitblog_00735的博客 284
上一篇: 从零开始用 Flask 搭建一个网站(一)
下一篇: 从零开始用 Flask 搭建一个网站(三)
极光推送
博客等级 码龄14年 109粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值