Python Flask学习知识点(六)

简介: timg (10).jpgimage.pngFlask多线程机制发送请求和服务器处理请求的线程之间的关系?客户端发送十个请求,Flask开启多少个线程处理请求?其实是由web服务器开启的多线程。
img_c4c2dd420ed5c7d133addb54360df967.jpe
timg (10).jpg
img_ff7a9a4843057a32a0ab99bdd772fe9b.png
image.png

Flask多线程机制

发送请求和服务器处理请求的线程之间的关系?
客户端发送十个请求,Flask开启多少个线程处理请求?其实是由web服务器开启的多线程。
如果要上生产线,一般不会用Flask自带的web server。
对于一个web网站而言,必须有承受并发的能力。

单线程:

如果是单线程,只有当一个请求处理完成之后,才会处理下一个请求,所以这时候看起来就像是要排队一样
单线程下,当一个请求进来之后,Flask会实例化一个Request对象,用这个对象来装载请求信息,这时候只有一个实例化的request,当第一个请求结束后,Flask会再实例化一个Request对象来装载第二个请求,然后request变量又指向当前请求,那么这样众多用户就不会混乱。

多线程:

werkzeug库下local模块下的Local对象,Flask就是用Local来做线程隔离的。
Local对象的本质就是用线程的id号作为字典的键这种基本原理实现的。

Flask中线程隔离栈LocalStack

LocalStack 是实现线程隔离的栈结构,把Local封装了。
LocalStack需要使用push方法

LocalStack:

  • Local特性

  • Stack特性:栈结构,只能取栈顶元素,先进后出

使用线程隔离的意义在于:使当前线程能够正确引用到他自己做创建的对象,而不是引用到其他线程做创建的对象

线程隔离对象 LocalStack
问:Flask使用LocalStack为了隔离哪个对象?
答:被线程隔离对象 RequestContext AppContext
Flask核心对象全局只有一个。

看一段测试代码,测试下LocalStack线程隔离:

import threading
from werkzeug.local import LocalStack

stack = LocalStack()
stack.push('a')
print('主线程top:', stack.top)


def child():
    print("子线程:", stack.top)
    stack.push('b')
    print('子线程:', stack.top)


t = threading.Thread(target=child, name='demo')
t.start()

print('主线程top:', stack.top)

打印结果:

主线程top: a
子线程: None
子线程: b
主线程top: a

还有哪些是被线程隔离的对象?


img_896acc7302962e14bc62573e29151872.png
image.png

以上都是被线程隔离的对象。

ViewModel的基本概念

很多时候,我们的数据在提交给页面的时候需要做一些处理或者裁剪,这时就需要ViewModel层来做这件事,如图:


img_b3095175b736f174f55cc94d07157f9b.png
image.png
viewModel作用
  1. 裁剪
  2. 修饰
  3. 合并

app文件夹下新建文件夹view_models,这里就可以处理数据的裁剪、修饰、合并。

单页面与网站的区别

一个网站页面由哪几部分构成?

  • JS CSS(静态文件)
  • HTML模板
  • 数据
网站

一般来讲,服务器端把数据返回到HTML模板中,称之为服务器渲染,然后返回到浏览器给用户,此时,客户端浏览器网页中的JS CSS起作用再一次发起请求渲染页面,这是一个完整的页面就处理完了。


img_69869fc1e922b3f36d5e11c7166317b2.png
image.png
单页面

浏览器去请求一个静态的html,html返回到客户端浏览器后,html里边的js css 发起请求,来填充数据。


img_c4a836b5915112a144b833e4cc1a1526.png
image.png
单页面和普通网站有什么区别:

区别的第一种说法:
对于多页面普通网站而言,大多数情况下它的数据渲染或者说模板填充都是在服务器端进行的,
而对于单页面来说,他数据的渲染是在客户端进行的。

区别的第二种说法:
单页面业务逻辑也就是说数据运算主要集中在客户端用js去操作,而普通网站而言,绝大多数业务逻辑是在服务器,也就是视图函数中去进行的。

目录
相关文章
|
19天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
1天前
|
数据可视化 数据挖掘 大数据
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
10天前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
2天前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
21天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
25天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
24天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
21天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
20天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
21天前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。