Python Flask学习知识点(五)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 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,其实就是在操作这两个栈的栈顶元素。

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
10天前
|
Python
python学习3-选择结构、bool值、pass语句
python学习3-选择结构、bool值、pass语句
|
1天前
|
开发框架 前端开发 数据库
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
|
1天前
|
数据采集 数据可视化 数据处理
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
|
4天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
5天前
|
数据可视化 Python
Python模型评估与选择:面试必备知识点
【4月更文挑战第17天】本文深入探讨了Python模型评估与选择在面试中的关键点,包括性能度量、过拟合与欠拟合识别、模型比较与选择、模型融合和偏差-方差权衡。强调了避免混淆评估指标、忽视模型验证和盲目追求高复杂度模型的常见错误,并提供相关代码示例,如交叉验证、网格搜索和超参数调优。通过理解这些概念和技巧,可在面试中展示出色的数据科学能力。
31 12
|
5天前
|
数据安全/隐私保护 Python
Python Flask-Mail实现邮件发送
Python Flask-Mail实现邮件发送
|
8天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
18 0
|
8天前
|
Python
python学习-函数模块,数据结构,字符串和列表(下)
python学习-函数模块,数据结构,字符串和列表
49 0
|
10天前
|
Python
python学习14-模块与包
python学习14-模块与包