Flask的多app应用,多线程如何体现
一、多app应用
在一个py文件中创建多个Flask的app对象
from werkzeug.wsgi import DispatcherMiddleware from werkzeug.serving import run_simple from flask import Flask, current_appapp1 = Flask('app01')app2 = Flask('app02')@app1.route('/index') def index():return "app01"@app2.route('/index2') def index2():return "app2"# app1匹配路由时不需要前缀,app2匹配路由时要加上/sec前缀 dm = DispatcherMiddleware(app1, {'/sec': app2, }) # 得到的这个dm对象没有run方法 # 所以要用run_simpleif __name__ == "__main__":app2.__call__run_simple('localhost', 5000, dm)
多app应用下的上下文管理,run_simple执行后当请求来时就会执行对象+括号,也就是对象的__call__方法
也就是DispatcherMiddleware的__call__方法,和单app的上下文管理是一样的,只不过多了一个筛选app的操作
class DispatcherMiddleware(object):def __init__(self, app, mounts=None):# dm = DispatcherMiddleware(# app1, # { '/sec': app2,})# 所以app就是app1,mounts就是{ '/sec': app2,}self.app = appself.mounts = mounts or {}def __call__(self, environ, start_response):# 得到当前请求对应的url,比如、/sec/index# 第二种情况,app1对应的url,比如/index没有前缀# 那么while只循环一次就推出了script = environ.get('PATH_INFO', '')path_info = ''# 循环判断/是否在url中# 第二次循环script就变成/sec了while '/' in script:# 第一次进来时这个条件不成立,mounts={"/sec":app2}# 第二次进来时条件成立if script in self.mounts:# 获取到的app就是app2app = self.mounts[script]break# 将url按/右分割,得到script是/sec,last_item是indexscript, last_item = script.rsplit('/', 1)# 拼接url,得到path_info就是/indexpath_info = '/%s%s' % (last_item, path_info)else:# while循环结束后依照字典中对应的url前缀取出app2# 第二种情况while循环结束后,字典中没有对应的url前缀,所以就用默认值self.app就是app1app = self.mounts.get(script, self.app)original_script_name = environ.get('SCRIPT_NAME', '')environ['SCRIPT_NAME'] = original_script_name + scriptenviron['PATH_INFO'] = path_info# app即是app2,加括号,执行对象的__call__方法,也就是Flask的__call__方法,从这里开始就是我们熟悉的了# 第二种情况url没有前缀这里的app就是app1return app(environ, start_response)
Flask中如何提现多线程:就是Local类中的字典,是以线程的唯一标识作为key的
flask的local中保存数据时,使用列表创建出来的栈。为什么用栈?
- 如果写web程序,web运行环境;栈中永远保存1条数据(可以不用栈)。
- 写脚本获取app信息时,可能存在app上下文嵌套关系,但是pop的时候是不会出错的,因为始终都是pop最近append进去的对象
from flask import Flask, current_app, globals, _app_ctx_stackapp1 = Flask('app01') app1.debug = False # 用户/密码/邮箱 app2 = Flask('app02') app2.debug = True # 用户/密码/邮箱 # 这样嵌套的app,stack属性列表中就不会只有一个值了, with app1.app_context(): # __enter__方法 -> push -> app_ctx添加到_app_ctx_stack.local# {<greenlet.greenlet object at 0x00000000036E2340>: {'stack': [<flask.ctx.AppContext object at 0x00000000037CA438>]}}print(_app_ctx_stack._local.__storage__)print(current_app.config['DEBUG'])with app2.app_context():# {<greenlet.greenlet object at 0x00000000036E2340>: {'stack': [<flask.ctx.AppContext object at 0x00000000037CA438> ]}}print(_app_ctx_stack._local.__storage__)print(current_app.config['DEBUG'])print(current_app.config['DEBUG'])
转载于:https://www.cnblogs.com/wanghl1011/articles/8659600.html
Flask的多app应用,多线程如何体现相关推荐
- 教育APP开发的特点体现
近年来,随着教育体制的改革和智能手机的普及,教育APP软件的开发大受欢迎.与传统教学方法不同,在线教育使很多人能够利用碎片化的时间学习,成为移动教育的主要模式,在线教育APP通过线下课程在线移动,但实 ...
- python函数库app_Python的Flask框架中@app.route的用法教程
在我上一篇文章,我搭了一个框架,模拟了Flask网站上"@app.route('/')"第一条例子的行为. 如果你错过了那篇"这不是魔法",请点击这里. 在这篇 ...
- Flask 处理高并发、多线程
文章目录 前言 一.通过设置app.run()的参数,来达到多线程的效果,具体参数: 二.使用genvent做协程,解决高并发: 三.通过Guicorn(with genvent)的形式来对app进行 ...
- 如何查看jinja2模板的上級_如何使用Python的Flask和谷歌app Engine来构建一个web app...
前言 如果您想在很短的时间内使用Python构建web应用程序,那么Flask是一个非常好的选择.Flask是一个小而强大的web框架.它也很容易学习和简单的代码. 在本教程中,我将向您展示如何使用A ...
- 如何使用Python的Flask和Google App Engine构建网络应用
by Tristan Ganry 由Tristan Ganry 这是一个小型教程项目,用于为初学者学习Flask,API和Google App Engine. (This is a small tut ...
- Flask之解读app.py文件
从flask包中导入Flask类 Flask这个类是项目的核心,以后很多操作都基于这个类的对象 注册url.注册蓝图等都是基于这个类的对象 from flask import Flask 创建一个Fl ...
- bottle mysql,web开发框架的选择(bottle or flask)及为autumn增加多线程支持
其实之前就有写过关于python web开发框架选择的文章,之前最终选择了bottle,并给出了bottle开发的物理设计,详见之前的文章:回归简单,向Django说再见.bottle做web开发的物 ...
- flask (python web app framework)
1. db migration error ref: alembic tutorial problem: raise util.CommandError("No such revision ...
- Flask 和 Google App Engine 部署模型服务
向AI转型的程序员都关注了这个号
最新文章
- 欧盟中止对中国数据卡产品“两反一保”调查
- exe程序获得外部传入命令行方法
- ylbtech-数据库设计与优化-对作为复选框/单选列表的集合表的设计
- linux 系统tar文件压缩打包命令
- C++:友元(非成员友元函数、成员友元函数、友元类)
- Hibernate5-多对1(n:1)-fetch=join
- 字符串处理 —— 单模式匹配 —— 朴素的字符串匹配算法(BF 算法)
- oracle signed类型,char、signed char 和 unsigned char 的区别
- 属性数量限制android,Android开发笔记 今天学到的一些属性
- IBM 开源处理加密数据的工具集
- oracle监听怎么关闭,Oracle数据库启动监听、关闭
- 分析优秀的.NET 文档设计工具Vsdocman 7.1 软件保护技术
- EHcache经典配置
- 简单理解Momentum,RMSprop,Adam优化算法
- 1个开发如何撑起一个过亿用户的小程序
- php 设置页面最大执行时间 set_time_limit max_execution_time
- 联想笔记本thinkbook win10系统安装
- C#获取汉字的区位码的方法
- ORACLE VARCHAR2和NVARCHAR2的区别
- 左耳朵耗子:你得知道,技术不是用来写 CRUD 的
热门文章
- 数据库系统概念总结:第七章 数据库设计和E-R模型
- mysql中int最大多少,int(11)最大長度是多少,MySQL中varchar最大長度是多少(轉)
- 小站教育携手神策数据,数据赋能留学语言培训教育的智能化探索
- 1 个闭环 + 1 个案例,为你解读实现数据驱动的秘诀
- 使用flexible适配移动端h5页面
- JS魔法堂:doctype我们应该了解的基础知识
- iOS如何随意的穿插跳跃,push来pop去
- 自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
- phpStorm如何用FTP,SSH连接到虚拟机linux系统?
- 关闭sql执行功能及找回08CMS系统管理员密码