一、多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应用,多线程如何体现相关推荐

  1. 教育APP开发的特点体现

    近年来,随着教育体制的改革和智能手机的普及,教育APP软件的开发大受欢迎.与传统教学方法不同,在线教育使很多人能够利用碎片化的时间学习,成为移动教育的主要模式,在线教育APP通过线下课程在线移动,但实 ...

  2. python函数库app_Python的Flask框架中@app.route的用法教程

    在我上一篇文章,我搭了一个框架,模拟了Flask网站上"@app.route('/')"第一条例子的行为. 如果你错过了那篇"这不是魔法",请点击这里. 在这篇 ...

  3. Flask 处理高并发、多线程

    文章目录 前言 一.通过设置app.run()的参数,来达到多线程的效果,具体参数: 二.使用genvent做协程,解决高并发: 三.通过Guicorn(with genvent)的形式来对app进行 ...

  4. 如何查看jinja2模板的上級_如何使用Python的Flask和谷歌app Engine来构建一个web app...

    前言 如果您想在很短的时间内使用Python构建web应用程序,那么Flask是一个非常好的选择.Flask是一个小而强大的web框架.它也很容易学习和简单的代码. 在本教程中,我将向您展示如何使用A ...

  5. 如何使用Python的Flask和Google App Engine构建网络应用

    by Tristan Ganry 由Tristan Ganry 这是一个小型教程项目,用于为初学者学习Flask,API和Google App Engine. (This is a small tut ...

  6. Flask之解读app.py文件

    从flask包中导入Flask类 Flask这个类是项目的核心,以后很多操作都基于这个类的对象 注册url.注册蓝图等都是基于这个类的对象 from flask import Flask 创建一个Fl ...

  7. bottle mysql,web开发框架的选择(bottle or flask)及为autumn增加多线程支持

    其实之前就有写过关于python web开发框架选择的文章,之前最终选择了bottle,并给出了bottle开发的物理设计,详见之前的文章:回归简单,向Django说再见.bottle做web开发的物 ...

  8. flask (python web app framework)

    1. db migration error ref: alembic tutorial problem: raise util.CommandError("No such revision ...

  9. Flask 和 Google App Engine 部署模型服务

    向AI转型的程序员都关注了这个号

最新文章

  1. 欧盟中止对中国数据卡产品“两反一保”调查
  2. exe程序获得外部传入命令行方法
  3. ylbtech-数据库设计与优化-对作为复选框/单选列表的集合表的设计
  4. linux 系统tar文件压缩打包命令
  5. C++:友元(非成员友元函数、成员友元函数、友元类)
  6. Hibernate5-多对1(n:1)-fetch=join
  7. 字符串处理 —— 单模式匹配 —— 朴素的字符串匹配算法(BF 算法)
  8. oracle signed类型,char、signed char 和 unsigned char 的区别
  9. 属性数量限制android,Android开发笔记 今天学到的一些属性
  10. IBM 开源处理加密数据的工具集
  11. oracle监听怎么关闭,Oracle数据库启动监听、关闭
  12. 分析优秀的.NET 文档设计工具Vsdocman 7.1 软件保护技术
  13. EHcache经典配置
  14. 简单理解Momentum,RMSprop,Adam优化算法
  15. 1个开发如何撑起一个过亿用户的小程序
  16. php 设置页面最大执行时间 set_time_limit max_execution_time
  17. 联想笔记本thinkbook win10系统安装
  18. C#获取汉字的区位码的方法
  19. ORACLE VARCHAR2和NVARCHAR2的区别
  20. 左耳朵耗子:你得知道,技术不是用来写 CRUD 的

热门文章

  1. 数据库系统概念总结:第七章 数据库设计和E-R模型
  2. mysql中int最大多少,int(11)最大長度是多少,MySQL中varchar最大長度是多少(轉)
  3. 小站教育携手神策数据,数据赋能留学语言培训教育的智能化探索
  4. 1 个闭环 + 1 个案例,为你解读实现数据驱动的秘诀
  5. 使用flexible适配移动端h5页面
  6. JS魔法堂:doctype我们应该了解的基础知识
  7. iOS如何随意的穿插跳跃,push来pop去
  8. 自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  9. phpStorm如何用FTP,SSH连接到虚拟机linux系统?
  10. 关闭sql执行功能及找回08CMS系统管理员密码