Python Flask学习知识点(六)
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
还有哪些是被线程隔离的对象?
以上都是被线程隔离的对象。
ViewModel的基本概念
很多时候,我们的数据在提交给页面的时候需要做一些处理或者裁剪,这时就需要ViewModel层来做这件事,如图:
viewModel作用
- 裁剪
- 修饰
- 合并
app文件夹下新建文件夹view_models,这里就可以处理数据的裁剪、修饰、合并。
单页面与网站的区别
一个网站页面由哪几部分构成?
- JS CSS(静态文件)
- HTML模板
- 数据
网站
一般来讲,服务器端把数据返回到HTML模板中,称之为服务器渲染,然后返回到浏览器给用户,此时,客户端浏览器网页中的JS CSS起作用再一次发起请求渲染页面,这是一个完整的页面就处理完了。
单页面
浏览器去请求一个静态的html,html返回到客户端浏览器后,html里边的js css 发起请求,来填充数据。
单页面和普通网站有什么区别:
区别的第一种说法:
对于多页面普通网站而言,大多数情况下它的数据渲染或者说模板填充都是在服务器端进行的,
而对于单页面来说,他数据的渲染是在客户端进行的。
区别的第二种说法:
单页面业务逻辑也就是说数据运算主要集中在客户端用js去操作,而普通网站而言,绝大多数业务逻辑是在服务器,也就是视图函数中去进行的。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Leetcode打卡 | No.25 k 个一组翻转链表
No.25 k 个一组翻转链表 给出一个链表,每k个节点一组进行翻转,并返回翻转后的链表。 k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么将最后剩余节点保持原有顺序。 示例 : 给定这个链表:1->2->3->4->5 当k= 2 时,应当返回:2->1->4->3->5 当k= 3 时,应当返回:3->2->1->4->5 说明 : ●你的算法只能使用常数的额外空间。●你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 特意留白一行 ,因为小詹做了两个多小时 ,还是没做出来 。。。。。。然后也就不想挣扎了 ,看了别人的代码 ,刷题这个东西 ,不能停啊 !不进则退 。 简单分析下思路 : ●链表长度应该是大于给定值 k 的 ,可以分两种情况进行处理 。 ●一种是连续 k 个节点做翻转 ,之后将多个链表片段进行整合 。 ●另一种是链表结尾多出的几个节点 ,不够 k 个节点的那部分保留不做翻转 。 以下是讨论区的代码 ,验证可行 。说实话 ,小詹自己是没想到 ,小詹自己想到的是...
- 下一篇
Python发送邮件模块之——yagmail模块
一、使用Python的第三方库yagmail模块发送邮件(本文以 QQ 邮箱示例) 1、通过Python的 yagmail模块发送邮件的前提: 开启SMTP服务、开通第三方授权(需要手机短信验证、QQ安全中心验证等) 2、在pycharm 中安装导入 yagmail模块 在pycharm的 Terminal 中输入命令 pip install yagmail 3、示例:发送邮件 import yagmail args={ "user":"26795909@qq.com", #发邮件账号 "password":"vknq*****aclbhje", #发件账号对应的密码(QQ使用的是授权码,而不是QQ密码) "host":"smtp.qq.com", #邮件账号的SMTP服务器 "port":"465" #SMTP服务器端口 465 } # yagmail.SMTP(**args) emailList=["13301****@qq.com","26795909@qq.com","34431****@qq.com","564****@qq.com","zh**@zh**...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池