2015-06-10 51 views
3

我正在嘗試使用金字塔爲數據分析管道創建一個Web界面。我正在使用變形和漏勺來製作表格。我已經適應這個例子:用金字塔在視圖和應用程序之間共享對象

http://pyramid-tutorials.readthedocs.org/en/latest/humans/security/step02/

大部分的工作被當表單被提交完成的,但也有一對夫婦的一般步驟只需要運行一次。我可以在服務器啓動時將一些內容加載到內存中,以便從視圖中訪問它們嗎?

回答

0

您可以在應用程序的主文件中定義一些模塊級別的變量(或可能在其他地方),然後按照您的要求通過導入它們來使用它們。

我使用此方法從環境變量創建SQLAlchemy的數據庫連接字符串等設置。

默認情況下,一個模塊只能在Python中解析一次,所以模塊級代碼只能運行一次。

更新1

讓我們假設一個金字塔項目的目錄結構如下:

. 
├── __init__.py 
├── models 
│   ├── __init__.py 
│   ├── meta 
│   │   ├── base.py 
│   │   ├── __init__.py 
│   │   ├── orm.py 
│   │   ├── schema.py 
│   │   ├── types.py 
│   ├── users.py 
├── security.py 
├── settings 
│   ├── database.py 
│   ├── email.py 
│   ├── __init__.py 
│   ├── redis.py 
│   ├── security.py 
├── static 
│   ├── css 
│   │   └── main.css 
│   └── js 
│    ├── app.js 
│    ├── app-services.js 
│    ├── controllers 
│    │   └── excel_preview.js 
├── templates 
│   ├── auth 
│   │   └── login.html 
│   ├── base.html 
│   ├── home.html 
├── views 
│   ├── auth.py 
│   ├── home.py 
│   ├── __init__.py 

比方說,我們在settings/redis.py下面的代碼:

import os 
import redis 


def get_redis_client(): 
    # Read settings from environment variables 
    redis_db_name = os.environ.get('REDIS_NAME') 
    redis_host = os.environ.get('REDIS_HOST') 
    redis_port = os.environ['REDIS_PORT'] 

    # create a redis connection 
    redis_client = redis.StrictRedis(
     host=redis_host, 
     port=redis_port, 
     db=redis_db_name, 
    ) 

    # return newly created redis connection 
    return redis_client 


redis_client = get_redis_client() 

SOME_SETTING_STORED_IN_REDIS = redis_client.get('some_setting_stored_in_redis') 

您可以使用此SOME_SETTING_STORED_IN_REDIS從任何地方變量。如果您的應用程序的名稱是example_app然後example_app/views/home.py你可以使用這樣的:

from pyramid.view import view_config 

from example_app.settings.redis import SOME_SETTING_STORED_IN_REDIS 


def includeme(config): 
    config.add_route('home', '/') 


@view_config(
    route_name='home', 
    renderer='home.html', 
    permission='authenticated' 
) 
def home_view(request): 

    return { 
     "some_setting": SOME_SETTING_STORED_IN_REDIS, 
    } 

我想你想達到類似的東西。

+0

謝謝,我是金字塔的新手,所以我可能會錯過一些明顯的東西。如果我成立了一個全球性的這樣的應用程序: '全球富 富=「這是一個全球性的」' 當我嘗試從視圖中打印它,我仍然得到一個錯誤: 'NameError:全球沒有定義名稱'foo' 我注意到的一件事是應用程序和視圖不會明確導入對方。我認爲服務器標識要使用裝飾器運行的視圖塊。 – ate50eggs

+0

我已經爲你添加了一些示例代碼。我已經使用模塊級變量而不是全局變量。 – pankaj28843

+0

謝謝!這個解決方案適用於我,雖然我花了一點時間才明白爲什麼。我認爲現在我在Python中獲得了更好的控制流。 – ate50eggs

0

如果「只需要運行一次的東西」的含義就像數據庫連接,一些配置數據等等 - 換句話說,在流程生命週期中從不改變的東西,然後將它們定義爲全局變量,在整個應用程序中使用都很好。例如:

APP_TITLE = 'Data Analysis Pipeline using Pyramid' 

@view_config(...) 
def home_view(request): 
    return "Welcome to %s" % APP_TITLE 

如果你想儲存一些全局狀態和重新使用它跨越的意見那就不是一個好主意。示例(壞的,不這樣做):

subscription_step = 1 

@view_config(...) 
def next_subscription_step(request): 
    global subscription_step 
    subscription_step += 1 
    return HTTPFound('/subscription/step_%s' % subscription_step) 

上面的代碼可能會出現你在本地工作,但事情將開始分開,只要有一個以上的用戶訪問應用程序,跌落或如果Web服務器產生另一個工作進程,或者如果Web服務器重新啓動,或者其他一百萬個其他原因。

+0

很好的建議。我不需要跨視圖更新數據,我只是將一些數據加載到內存中,以便每個視圖都可以看到它。 – ate50eggs

相關問題