2016-02-27 2 views
3

У меня есть приложение Django с общей структурой каталогов:Django: где settings.py ищет импорт и почему?

project 
---manage.py 
---app 
    ---__init__.py 
    ---settings.py 
    ---settings_secret.py 
    ---a bunch of other files for the app itself 

Это settings_secret.py файл содержит переменные из secrets.py, которые я не хочу, чтобы отправить GitHub. По какой-то причине я не могу импортировать его в settings.py. Первые 5 строк settings.py:

# Django settings for project. 
DEBUG = True 
TEMPLATE_DEBUG = DEBUG 
import os 
from settings_secret import * 

Который терпит неудачу с частичной StackTrace:

File "/foo/bar/project/app/settings.py", line 5, in <module> from settings_secret import * 
ImportError: No module named 'settings_secret' 

Для отладки, я создал тестовый файл внутри/проекта/вот так:

from settings_secret import * 
print(VARIABLE_FROM_SETTINGS_SECRET) 

Который работал как шарм. Настолько ясно, что settings.py не ищет нужного места для settings_secret. Итак, где он смотрит?

+0

У вас есть файл '__init __. Py' под' app'? Вы также должны выполнить 'from .settings_secret import *' в 'settings.py'. – bbayles

+0

У меня есть '__init __. Py', просто забыл включить в вопрос. Отредактировано. И да, я попробовал «.settings_secret import *», и это сработало - но почему? Почему он работает и почему он не работает без точки, как в моем тестовом файле? – fildred13

+1

Я думаю, вы должны скорее установить свой импорт через переменные среды, а не «секретный файл». http://12factor.net/config – geekazoid

ответ

2

В settings.py, вы должны сделать: from .settings_secret import *

Он работает с ., потому что правильный синтаксис должен быть:

from app.settings_secret import *

Удаление app является сокращённым кодирование, но тот же принцип применяется. Вам нужно сказать Django о поиске каталога (app), а затем вы указываете, какой файл в этом каталоге искать.

Если вы только что сделали, from settings_secret import *, вы рассказываете Django о поиске каталога settings_secret, которого не существует.

Это имеет смысл для вас?

+0

Да, это имеет смысл. Как и было задано, это, очевидно, правильный ответ, поэтому я принимаю. Однако geekazoid сделал хороший вывод в комментариях выше, и другие должны рассмотреть возможность использования переменных окружения вместо локального файла настроек, когда это возможно. – fildred13

Смежные вопросы