Flask的多app应用,多线程如何体现
生活随笔
收集整理的這篇文章主要介紹了
Flask的多app应用,多线程如何体现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、多app應(yīng)用
在一個py文件中創(chuàng)建多個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應(yīng)用下的上下文管理,run_simple執(zhí)行后當請求來時就會執(zhí)行對象+括號,也就是對象的__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):# 得到當前請求對應(yīng)的url,比如、/sec/index# 第二種情況,app1對應(yīng)的url,比如/index沒有前綴# 那么while只循環(huán)一次就推出了script = environ.get('PATH_INFO', '')path_info = ''# 循環(huán)判斷/是否在url中# 第二次循環(huán)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循環(huán)結(jié)束后依照字典中對應(yīng)的url前綴取出app2# 第二種情況while循環(huán)結(jié)束后,字典中沒有對應(yīng)的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,加括號,執(zhí)行對象的__call__方法,也就是Flask的__call__方法,從這里開始就是我們熟悉的了# 第二種情況url沒有前綴這里的app就是app1return app(environ, start_response)?
?
?
Flask中如何提現(xiàn)多線程:就是Local類中的字典,是以線程的唯一標識作為key的
flask的local中保存數(shù)據(jù)時,使用列表創(chuàng)建出來的棧。為什么用棧?
- 如果寫web程序,web運行環(huán)境;棧中永遠保存1條數(shù)據(jù)(可以不用棧)。
- 寫腳本獲取app信息時,可能存在app上下文嵌套關(guān)系,但是pop的時候是不會出錯的,因為始終都是pop最近append進去的對象
?
轉(zhuǎn)載于:https://www.cnblogs.com/wanghl1011/articles/8659600.html
總結(jié)
以上是生活随笔為你收集整理的Flask的多app应用,多线程如何体现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis分布式锁---完美实现
- 下一篇: Js判断下拉框是否为空值