Как импортировать константу из settings django
Перейти к содержимому

Как импортировать константу из settings django

  • автор:

Глобальные константы в Django

Всем привет! Перехожу с богомерзкого php на великолепный python. Как следствие осваиваю django 🙂 И вот есть вопрос: хочу хранить путь к каталогу проекта как глобальную переменную (код из файла settings.py)

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) PROJECT_ROOT = os.path.normpath(os.path.abspath(PROJECT_ROOT)) 

При попытке вызвать оную константу из файла app/modules.py получаю:

NameError: name ‘PROJECT_ROOT’ is not defined

Умные дяди, подскажите маленькому: как хранить глобальные константы?
Отслеживать
задан 5 дек 2011 в 11:53
168 2 2 серебряных знака 6 6 бронзовых знаков
код вызова пожалуйста покажите, settings.py — подключен?
5 дек 2011 в 11:56

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

from django.conf.settings import PROJECT_ROOT 

Отслеживать
ответ дан 5 дек 2011 в 12:07
3,028 13 13 серебряных знаков 14 14 бронзовых знаков
Модуль config, которого не было? from django.conf import settings
10 апр 2015 в 18:23

С точки зрения безопасности глобальные переменные — плохая идея. В то же время вы всегда можете использовать

from proj_name.settings import your_var 

Это позволит разделять пространство имён и использовать удобные для Вас переменные в нужном месте.

Как получить доступ к значению константы в settings.py

Я хотел бы спросить, как получить доступ к значению константы, объявленной в setting.py следующим образом:

PAYMENT_VARIANTS = < 'redsys': ('payments_redsys.RedsysProvider', < 'merchant_code': '123456789', 'terminal': '1', 'shared_secret': 'aaaaaaaaaaaaaaaaaaaaaaaaaa', 'currency': '978', >) 

Я могу импортировать:

from django.conf import settings 

Но, как я могу получить доступ к значению поля ‘currency’ или другого на этом уровне.

Спасибо, с уважением,

Вы можете сделать, например, так:

from django.conf import settings if settings.DEBUG: # Do something 

В вашем случае это будет что-то вроде:

settings.PAYMENT_VARIANTS['redsys'] 

Вы можете получить доступ к словарю PAYMENT_VARIANTS, используя settings.PAYMENT_VARIANTS и получить доступ к ключу currency следующим образом

settings.PAYMENT_VARIANTS['redsys'][1]['currency] 

Django — Урок 010. Получение переменных в шаблоне из файла settings.py в Django

В файле settings.py в Django мы храним всю необходимую конфигурационную информацию нашего приложения, в состав которой может входить URL сайта или пути к определённым директориям, в которых хранятся специальный файлы и многая другая информация. И иногда требуется данные переменные использовать в шаблонах, тот же самый URL сайта. Но просто прописав в шаблоне эту константу через > , воспользоваться данной переменной не получится. Одним из способов решения данной задачи является регистрация шаблонных тегов, которые будут выполнять определённый функционал, например забирать атрибут из файла настроек по его имени.

Регистрация шаблонного тега

Раз уж речь зашла об использовании SITE_URL в шаблоне, то договоримся, что в файле settings.py мы прописали данную переменную.

 
SITE_URL = 'www.mysite.com'

А далее идём в то приложение, в котором зарегистрируем тег для получения атрибутов из файла settings.py. В моём случае это приложение home. В данном приложении необходимо будет создать каталог templatetags и разместить в нём два файла: init .py и например home_extras.py . Получим следующую структуру приложения:

 
home/ migrations/ templates/ templatetags/ __init__.py home_extras.py __init__.py admin.py apps.py models.py sitemap.py tests.py urls.py views.py

А теперь посмотрим содержимое файла home_extras.py.

 
from django import template from django.conf import settings register = template.Library() # Регистрируем тег, с помощью которого будем получать атрибуты из файла settings @register.simple_tag def get_attribute(name): return getattr(settings, name, "")

Использование в шаблоне

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

Для Django рекомендую VDS-сервера хостера Timeweb .

Рекомендуем хостинг TIMEWEB

Рекомендуем хостинг TIMEWEB

Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

  • Django - Урок 050. Создание динамических настроек сайта с помощью SingletonModel
  • Django - Урок 015. Получение IP адреса и предыдущего URL из запроса
  • Django - Урок 013. Контактная форма на Django
  • Django - Урок 011. Добавление комментариев на сайт с Django
  • Django - Урок 009. Иконки социальных сетей "Поделиться" без JavaScript
  • Django - Урок 008. Добавление файлов Sitemap на сайт с Django
  • Django - Урок 005. Добавление RSS ленты на сайт с Django

По статье задано0 вопрос(ов)

Подписка на обсуждение 0
Подписка на раздел 179

Вам это нравится? Поделитесь в социальных сетях!

django-pkgconf

rick-and-morty

Rick and Morty ©. Чувак презентует батарейку, я тоже.

Не так давно я опубликовал небольшое приложение для формирования «панелей управления» django-проектов. В процессе разработки столкнулся с банальной ситуацией хранения дефолтных настроек модуля. Скорый поиск по гитхабу дал понять, что каждый разработчик использует свою реализацию. Существуют также готовые решения, однако, мне они показались избыточными в таком простом вопросе, поэтому я поступил мудро и запилил свой велосипед.

Может показаться, что данная батарейка будет полезна только OSP-шникам, но штука в том, что эту же самую идею можно использовать в повседневной жизни.

«Банальная ситуация»

Допустим, вы написали свое приложение, которое что-то там делает. При этом, есть возможность в settings.py проекта выставить какие-то значения, которые перепишут те, что идут из коробки. Итого вся задача сводится к двум вещам: хранить значения по-умолчанию и дать разработчику-потребителю их переписать в своем файле настроек.

# Дефолтное значение в app/my_settings.py FOO = True # Вы ставите в settings.py FOO = False # В итоге, переписалось from django.conf import settings settings.FOO False 

Используем у себя в проекте

Сейчас уже привычно разрабатывать проект модульно разбивая его на "приложения". Практически все вынесено в индивидуальные файлы аппы: models, views, urls… кроме settings. Например, вы пишете адаптер к сервису рассылок и следующий код в каком-нибудь newsletters/adapter.py :

adapter = Adapter(username='user', password='pass')

Вы будете правы, если скажете, что хардкодить логин и пароль глупо и их надо вынести в константы:

USERNAME = 'user' PASSWORD = 'password' adapter = Adapter(username=USERNAME, password=PASSWORD)

Вроде бы близко, но все равно не то. Еще подход:

# settings.py NEWSLETTERS_USERNAME = 'user' NEWSLETTERS_PASSWORD = 'password' # newsletters/adapter.py from django.conf import settings adapter = Adapter(username=settings.NEWSLETTERS_USERNAME, password=settings.NEWSLETTERS_PASSWORD)

Похоже на правду. Однако есть несколько "но":

  • вот это NEWSLETTERS_ не очень удобно. Во-первых, просто больше повторяющихся букв в коде; во-вторых, значения могут быть более универсальным и использоваться чаще, от чего эта причина становится все печальнее
  • эти настройки не относятся к проекту, но нужны для отдельного приложения и, вероятно, за его пределами не используются — так зачем их держать в основном файле?
  • если аппа разрабатывается одним человеком в комманде, его коммит ограничивается директорией приложения

django-pkgconf

Попробуем сделать так:

# newsletters/conf.py from pkgconf import Conf class NewsLetters(Conf): USERNAME = 'username' PASSWORD = 'password' # newsletters/adapter.py from . import conf adapter = Adapter(username=conf.USERNAME, password=conf.PASSWORD)

Условия выполнены: нет префикса, нет захламления файла настроек проекта.
Переопределим значения в Dev настройках*:

# local_settings.py NEWSLETTERS_USERNAME = 'test_user'

Готово. Это перепишет значение USERNAME для конфигурации приложения newsletters , а значение PASSWORD останется прежним, потому что мы его не меняли. В результате получаем аккуратный и стройный settings.py , где лежат всякие там DATABASES , TEMPLATES и т.д., только то, что относится к проекту.

Совместимость

Тесты проводились на python 2.7.9, 3.4.3, 3.5.0 и django 1.8, 1.9.

Name Stmts Miss Cover ----------------------------------------- pkgconf/__init__.py 22 0 100%

* Пожалуйста, не делайте так, используйте django-configurations.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *