2010-10-26 81 views
12

我讀通過燒瓶DOC - 和整個this傳來:上下文本地人 - 他們如何使本地上下文變量全局?

...對於Web應用程序是要 關鍵反應的數據發送到 服務器的客戶端。在Flask中,這個信息是由全局請求對象提供的 。 如果您對 Python有一些經驗,您可能想知道該對象可以是全局的,以及Flask 如何管理仍然是線程安全的。該 答案是上下文當地人...

現在我明白方面當地人要的東西,如with聲明(當然那是在python 2.6 doc似乎什麼建議)。我努力想知道這將如何讓你擁有駐留在本地命名空間中的全局可訪問的變量?這在概念上如何工作?

另請參見:全局變量通常被認爲是骯髒的我接受它,那麼爲什麼這是行嗎?

+3

這是可以的,因爲磨砂全局上下非常徹底。 – aaronasterling 2010-10-26 14:47:45

回答

4

它們實際上是代表對象的實際對象,因此當您引用一個時,您可以訪問當前線程的對象。

一個例子是request對象。你可以看到這是在globlals.py中設置的,然後導入__init__.py的燒瓶。

這樣做的好處是,你可以通過做

from flask import request 

訪問請求和寫方法,如

@app.route('/') 
def hello_world(): 
    return "Hello World!" 

,而不必通過周圍請求作爲參數。

這是利用從Werkzeug一些可重用的代碼庫。

+0

對不起,如果我是密集的:但如果我得到這個正確他們推上下文到一種'堆棧',然後能夠適當地路由屬性調用到基於這個堆棧正確的鏈接對象? – Malang 2010-10-26 10:55:44

+1

如果您獲取[Werkzeug的源代碼](http://pypi.python.org/packages/source/W/Werkzeug/Werkzeug-0.6.2.tar.gz)的副本並查看「local.py」你會看到'Local'類基本上使用了一個字典,它包含當前線程ID作爲密鑰來透明地存儲和檢索正確的對象。如果不設置一些測試來找出代碼正在做什麼,這是我可以推出的限制。 – mikej 2010-10-26 11:36:29

+0

我不認爲上面的堆棧是必要的。這只是一個猜測,但堆棧可能會在鏈接到的文檔中添加與此註釋相關的額外圖層:*它以智能的方式執行,以便一個應用程序可以調用另一個應用程序而不會中斷。* – mikej 2010-10-26 11:37:23

-2

命名空間在Python基本上是字典 你可以做

globals()['foo']=bar
+0

+1好點: ) – Malang 2010-10-26 15:45:47

+0

爲什麼這會被投票?我希望S/O強制底層選民留下解釋。這可能是一個很好的學習。我可能錯過了一些東西,但是如果我使用線程ID作爲'foo',它看起來像一個完美的線程全局變量,它與接受的答案基本相同。Python內置'dict'是線程安全的。 – 2015-02-07 18:50:35

相關問題