Вы можете определить некоторые переменные уровня модуля в главном файле приложения (или может быть где-то еще), а затем использовать их, импортировав их в соответствии с вашим требованием.
Я использую этот метод для создания таких параметров, как строка подключения к базе данных для 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,
}
Я думаю, что вы пытаетесь достичь чего-то подобного.
Спасибо, я новичок в Pyramid, поэтому мне может не хватать чего-то очевидного. Если я создал глобальный в приложении, как это: 'глобального Foo Foo =«это глобальное»' я все еще получаю сообщение об ошибке при попытке напечатать его с точки зрения: 'NameError: глобальный name 'foo' не определен' Одна вещь, которую я замечаю, это то, что приложение и представление не импортируют друг друга явно. Я думаю, что сервер идентифицирует блок просмотра для запуска с использованием декоратора. – ate50eggs
Я добавил несколько примеров кода для вас.Я использовал переменные уровня модуля вместо globals. – pankaj28843
Спасибо! Это решение работает для меня, хотя мне потребовалось немного времени, чтобы понять, почему. Я думаю, что теперь я получаю контроль над Python немного лучше. – ate50eggs