日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flask的多app应用,多线程如何体现

發(fā)布時間:2025/3/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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進去的對象

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'])

?

轉(zhuǎn)載于:https://www.cnblogs.com/wanghl1011/articles/8659600.html

總結(jié)

以上是生活随笔為你收集整理的Flask的多app应用,多线程如何体现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。