2015-06-10 10 views
3

Я пытаюсь создать веб-интерфейс для конвейера анализа данных с использованием Pyramid. Я использую деформирование и дуршлаг для создания форм. Я адаптируют этот пример:Совместное использование объектов между представлением и приложением с помощью Pyramid

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

Большая часть работы может быть сделано, когда форма получает представлены, но есть несколько общих шагов, которые необходимо только один раз запустить. Могу ли я загружать некоторые вещи в память, когда сервер запускается, чтобы они были доступны изнутри представления?

ответ

0

Вы можете определить некоторые переменные уровня модуля в главном файле приложения (или может быть где-то еще), а затем использовать их, импортировав их в соответствии с вашим требованием.

Я использую этот метод для создания таких параметров, как строка подключения к базе данных для SQLAlchemy из переменных окружения.

По умолчанию модуль будет разбираться только один раз в Python, поэтому код уровня модуля будет запускаться только один раз.

Update 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

Спасибо, я новичок в Pyramid, поэтому мне может не хватать чего-то очевидного. Если я создал глобальный в приложении, как это: 'глобального Foo Foo =«это глобальное»' я все еще получаю сообщение об ошибке при попытке напечатать его с точки зрения: 'NameError: глобальный name 'foo' не определен' Одна вещь, которую я замечаю, это то, что приложение и представление не импортируют друг друга явно. Я думаю, что сервер идентифицирует блок просмотра для запуска с использованием декоратора. – ate50eggs

+0

Я добавил несколько примеров кода для вас.Я использовал переменные уровня модуля вместо globals. – 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) 

Приведенный выше код может появиться на работу для вас на месте, но все начнет разваливаться, как только есть более чем один пользователь доступа приложение, или если веб-сервер запускает другой рабочий процесс или перезапускается веб-сервер или миллион других причин.

+0

Хороший совет. Мне не нужно обновлять данные по представлениям, я просто загружаю некоторые данные в память, чтобы каждый вид мог ее видеть. – ate50eggs