Проблема с импортом настроек конфигурации django

У меня есть следующая структура в проекте django.

У меня есть файл provider.py, в котором:

from django.conf import settings
from project.utils.firewalls import fw

В провайдерах мне нужно определить некоторые вары в настройках.

Затем в firewalls.py у меня есть:

from django.conf import settings

Также в firewalls.py у меня есть код, который должен получить переменную, определенную в настройках.

Когда я пытаюсь сделать: python manage.py --settings=project.settings.local будет жаловаться на отсутствие определения SECRET_KEY, хотя он определен.

Это связано с тем, что я импортирую django.conf.settings в оба файла.

Как я могу этого избежать?

На данный момент я жестко запрограммировал значение var в firewalls.py, но я бы хотел этого избежать.

Редактировать:

Добавить стектрек:

➤ python project/manage.py runserver --settings=project.settings.local               
Traceback (most recent call last):                                                   
  File "project/manage.py", line 15, in <module>                                     
    execute_from_command_line(sys.argv)                                              
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line    
    utility.execute()                                                                
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute    
    self.fetch_command(subcommand).run_from_argv(self.argv)                          
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv    
    self.execute(*args, **cmd_options)                                               
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 60, in execute    
    super().execute(*args, **options)                                                
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/core/management/base.py", line 353, in execute    
    output = self.handle(*args, **options)                                           
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 67, in handle    
    if not settings.DEBUG and not settings.ALLOWED_HOSTS:                            
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/conf/__init__.py", line 57, in __getattr__    
    self._setup(name)                                                                
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/conf/__init__.py", line 44, in _setup    
    self._wrapped = Settings(settings_module)                                        
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/conf/__init__.py", line 107, in __init__    
    mod = importlib.import_module(self.SETTINGS_MODULE)                              
  File "/home/bsabin/Projects/repo/venv/lib64/python3.7/importlib/__init__.py", line 127, in import_module    
    return _bootstrap._gcd_import(name[level:], package, level)                      
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import                    
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load                  
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked         
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked                  
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module            
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed       
  File "/home/bsabin/Projects/repo/project/project/settings/local.py", line 1, in <module>    
    from .base import *                                                              
  File "/home/bsabin/Projects/repo/project/project/settings/base.py", line 21, in <module>    
    from project.utils.providers import AProvider, BProvider, CProvider              
  File "/home/bsabin/Projects/repo/project/project/utils/providers.py", line 6, in <module>    
    from project.utils.firewalls import fw                                           
  File "/home/bsabin/Projects/repo/project/project/utils/firewalls.py", line 29, in <module>    
    fw = get_firewall_instance()                                                     
  File "/home/bsabin/Projects/repo/project/project/utils/firewalls.py", line 11, in get_firewall_instance    
    token = settings.DO_TOKEN.get('token')                                           
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/conf/__init__.py", line 57, in __getattr__    
    self._setup(name)                                                                
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/conf/__init__.py", line 44, in _setup    
    self._wrapped = Settings(settings_module)                                        
  File "/home/bsabin/Projects/repo/venv/lib/python3.7/site-packages/django/conf/__init__.py", line 126, in __init__    
    raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")                                                                                                                                                                                                                                                  
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty. 

можете ли вы добавить полную трассировку стека, пожалуйста?

ruddra 07.04.2019 22:25

Я отредактировал сообщение.

bsd 07.04.2019 22:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Если вам нужны какие-то переменные для конфигурации, почему бы вам не передать переменную в функцию напрямую. Например:

# in settings:

from project.utils.providers import AProvider, BProvider, CProvider
SOME_VARIABLE = AProvider(token = "Your Token")

Затем внутри провайдеров

class AProvider(...):
   def __init__(self, *args, **kwargs):
        token = kwargs.get('token')
        # rest of the code

  # somewhere in the code
  fw = get_firewall_instance(self.token)

В firewall.py:

def get_firewall_instance(token_from_settings):

     token = token_from_settings

в firewalls.py у меня есть функция, которая возвращает экземпляр класса. Я определяю переменную внутри firewalls.py с именем fw. Я хочу использовать его как синглтон. В provider.py я импортирую из project.utils.firewalls import fw Который загружается один раз, именно то, что мне нужно. Это означает, что у меня нет возможности передать переменную функции, определенной в firewalls.py.

bsd 07.04.2019 22:52

Настройки django - это синглтон, почему бы вам его не использовать :)?

ruddra 07.04.2019 22:54

Переместить всю функцию в настройку?

bsd 07.04.2019 22:54

Вы не предоставили общий доступ ко всему коду, поэтому трудно сказать, что следует делать. Возможно, вы можете поместить функцию в другое место и передать значение конфигурации из настроек в качестве параметра и создать экземпляр брандмауэра. Затем введите значение в настройках. как в settings.py FIREWALL=get_firewall_instance(token), и использовать его везде (и не импортировать эти классы провайдеров обратно в настройки).

ruddra 07.04.2019 22:59

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

bsd 07.04.2019 23:25

Мне удалось решить проблему, загрузив провайдеров с помощью getattr и передав строку. Я не импортирую их в файл настроек. Спасибо !

bsd 08.04.2019 10:02

Другие вопросы по теме