Python Flask学习知识点(五)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: timg (9).jpg从本章开始,逐步引入数据库相关知识点。关于数据库的工具以及一些入门的知识请自行查找资料学习(例如:创建数据表,数据库可视化工具)。
img_ee742ee115a28d8bde8ac4adefc8c7a9.jpe
timg (9).jpg

从本章开始,逐步引入数据库相关知识点。
关于数据库的工具以及一些入门的知识请自行查找资料学习(例如:创建数据表,数据库可视化工具)。

数据表创建方式

img_10edb324eae6cb82e92380725b1fe5c5.png
image.png

对于我们开发人员来说,一般推荐使用Code First ,因为可以专注业务模型的设计 而不是数据库设计 , 数据库只是用来存数据的 ,它的表关系应该由我们业务来决定。
那么其他两种数据表创建方式可以自己上网查询相关资料,这里不再赘述。

定义一个模型类

之前提过一个叫做验证层,现在引入模型层(MVC中的M:模型层)
设计模型的思维,应该考虑业务模型,而不要去过多注意数据库的设计,数据库只是存数据的。
app文件夹下新建models文件夹并新建一个名为book.py的模型:


img_73c86e175a77440f67c1027031e3fde2.png
image.png

这里使用sqlalchemy这个包来做模型映射,还有一个包叫做flask_sqlalchemy,是flask在sqlalchemy的基础上做了一些自己的封装,待会我们也要用到。
再介绍一个第三方的独立的包:WTFORMS,Flask也针对这个包做了封装并有一个新的包叫做Flask_WTFORMS,以上两个(sqlalchemy、WTFORMS)是独立的两个包,可以用在任何时候而不仅仅在Flask中。

Flask的路由是在werkzeug基础上封装的
Flask是微框架,只提供最核心的功能其他部分可以自由组装
所有flask插件都必须和flask核心对象app绑定在一起

安装两个包:
pip install sqlalchemy
pip install flask-sqlalchemy

编辑book.py:

from sqlalchemy import Column, Integer, String
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
class Book(db.Model):
    # 主键 自增
    id = Column(Integer, primary_key=True, autoincrement=True)
    # 长度50 不为空
    title = Column(String(50), nullable=False)
    author = Column(String(30), default="未知")
    # unique : 不重复, 会加一个索引, 不重复
    uid= Column(String(15), nullable=False, unique=True)

以上代码就是一个简单的创建数据表的模型,包含四个字段,

之前提到过,所有的Flask的插件都需要和Flask的核心对象app来关联起来,那么怎么做关联呢?
在app文件夹下的__init__.py中:

from flask import Flask
from app.models.book import db

def create_app():
    app = Flask(__name__)
    app.config.from_object("app.setting")
    app.config.from_object("app.secure")

    register_blueprint(app)

    db.init_app(app)
    db.create_all(app=app)
    return app


def register_blueprint(app):
    from app.web import web
    app.register_blueprint(web)

首先把db对象导入,
再使用db.init_app(app)做关联,init_app这个方法很重要,后边所有的Flask插件都使用这个方法做关联。

接着,
需要把数据库的配置信息放到配置文件中,因为数据库配置信息是属于比较机密的,所以我们放在secure.py中。

SQLALCHEMY_DATABASE_URI = 'mysql+cymysql://root:123456@127.0.0.1:3306/demo'

上边配置信息的变量名SQLALCHEMY_DATABASE_URI这个是不可以更改的,必须使用这个,
后边参数的意思是使用cymysql这个驱动来做数据库操作,用户名root 密码 123456,ip 端口是127.0.0.1 3306,数据库名为demo。
cymysql需要安装:pip install cymysql
运行代码查看结果,数据库确实多了一张名为book的表。

ORM与Code First

ORM 对象关系映射 : 包含的层面更广阔 不仅仅是创建 还包含查询 更新 删除

Code First : 解决的是数据表创建的问题,专注业务模型设计而不是数据库设计,数据库只是存数据的,表关系应该有业务来决定

业务逻辑最好写在MVC中M中

Flask中上下文管理

  • 应用上下文(AppContext)
  • 请求上下文(RequestContext)

上下文本质来说其实就是对象
应用上下文:对核心对象Flask的封装
请求上下文:对请求对象Request的封装

为什么会需要上下文?直接操作Flask核心对象不行吗?
其实这个就是一个设计思想的问题,有时候对于一个对象来说,有一些信息是属于这个对象外部的,并不是属于对象本身,那么此时我们可以设计一个所谓的上下文(上下文就是一个对象),把Flask核心对象和外部的这些数据一起组成一个整体,这个整体就是我们说的上下文对象。

Flask核心对象:承载着各种各样的功能,例如:保存配置文件信息、提供注册路由\视图函数等这样的功能。
AppContext :把Flask核心对象做了一系列封装,并且附加了一些额外的参数
Request :保存了一些请求信息,例如: URL参数,完整的URL等等一切的请求信息都在这个对象中。
RequestContext : 对Request对象的封装。

在我们编码过程中,真正想去使用的是Flask核心对象或者是Request这个对象,但是我们要使用它并不一定要直接直接导入这俩核心对象,正确的做法是:
从AppContext或RequestContext间接的去拿Flask核心对象或者是Request。
Flask中,采用了LocalProxy模式(本地代理)的模式提供了间接去操作上下文的能力,也就是current_app和request这两个对象。
这里Flask使用了设计模式里边的代理模式。

Flask上下文与出入栈

Flask如何操作上下文?看下图:


img_d7eec0547dce4e9b02db8257748c09fc.png
image.png

当一个请求进入Flask框架中时,首先会实例化一个RequestContext(请求上下文),这个请求上下文封装了这次请求的相关信息,请求的相关信息在Request中,然后会把请求上下文使用push方法推入到栈中(栈:先入后出),Flask中使用 LocalStack 来表示一个栈,LocalStack 是一个对象,实例化之后,用 _request_ctx_stack 来表示RequestContext推入的栈,同样的,还有一个 _app_ctx_stack 也是一个栈,
RequestContext在入栈之前,Flask会去检查一下 _app_ctx_stack 这个栈的栈顶的元素,如果是空或者不是当前对象,那么Flask会把AppContext推入_app_ctx_stack这个栈中
然后才会把RequestContext推入_request_ctx_stack栈中。

current_app(Local Proxy) 和 request(Local Proxy) 永远都是指向栈顶的,所以当你去使用current_app或request,其实就是在操作这两个栈的栈顶元素。

欲知后事如何,请看下回分解,记得点个赞~感谢

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
1月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
292 0
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
161 1
|
1月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
248 1
|
1月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
135 4
|
2月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
4月前
|
算法 IDE 测试技术
python学习需要注意的事项
python学习需要注意的事项
266 57
|
4月前
|
JSON 数据安全/隐私保护 数据格式
拼多多批量下单软件,拼多多无限账号下单软件,python框架仅供学习参考
完整的拼多多自动化下单框架,包含登录、搜索商品、获取商品列表、下单等功能。
|
4月前
|
机器学习/深度学习 数据安全/隐私保护 计算机视觉
过三色刷脸技术,过三色刷脸技术教程,插件过人脸python分享学习
三色刷脸技术是基于RGB三通道分离的人脸特征提取方法,通过分析人脸在不同颜色通道的特征差异
|
4月前
|
监控 数据安全/隐私保护 Python
微信自动抢红包免费版,2025微信抢红包神器,微信红包挂苹果版【python仅供学习】
这个模拟项目包含5个模块:核心监控逻辑、用户界面、配置管理、实用工具和主程序入口

推荐镜像

更多
下一篇
oss云网关配置