3

Pyramid を使用してデータ分析パイプライン用の Web インターフェイスを作成しようとしています。私はフォームを作るために変形とザルを使用しています。私はこの例を適応させてきました:

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

ほとんどの作業はフォームが送信されたときに完了しますが、一度だけ実行する必要がある一般的な手順がいくつかあります。ビュー内からアクセスできるように、サーバーの起動時にいくつかのものをメモリにロードできますか?

4

2 に答える 2

0

アプリケーションのメイン ファイル (または別の場所) でいくつかのモジュール レベルの変数を定義し、必要に応じてそれらをインポートして使用できます。

この方法を使用して、環境変数から SQLAlchemy のデータベース接続文字列などの設定を作成します。

デフォルトでは、モジュールは Python で 1 回だけ解析されるため、モジュール レベルのコードは 1 回だけ実行されます。

更新 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,
    }

あなたは似たようなことを達成しようとしていると思います。

于 2015-06-10T11:32:49.127 に答える
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 サーバーが再起動するか、またはその他の何百万もの理由が発生するとすぐに、問題が発生し始めます。 .

于 2015-06-10T21:45:01.170 に答える