У меня возникла проблема в моем проекте Django, когда я дважды импортирую один и тот же модуль. Это приводит к сбою моего модульного теста: этот модульный тест проверяет, что представление, найденное путем разрешения URL-адреса, является тем же представлением, импортированным из тестируемого приложения. Итак, мой тестовый файл выглядит примерно так:
from django.core.urlresolvers import resolve
from django.tests import TestCase
from .views import index
class IndexText(TestCase):
def test_root_url_resolves_to_index_view(self):
found = resolve('/someapp/')
import pdb; pdb.set_trace() # Using this to debug because the below assertion is failing
self.assertEqual(found.func, index)
Приведенное выше утверждение неверно, потому что две функции не равны. При отладке в pdb я обнаружил, что found.func.__module__
— это someapp.views
, а index.__module__
— это projectName.someapp.views
.
В #django на Freenode мне сказали, что это может быть связано с тем, что, хотя я недавно обновился до Django 1.6, я использовал старую структуру проекта 1.3, где файлы settings.py и urls.py находятся в корне проекта вместе с управлением. ру.
Я исправил это, создав новый каталог в корне моего проекта с тем же именем, что и каталог, содержащий корень проекта, и поместил в этот каталог мои urls.py и settings.py. Итак, моя структура каталогов выглядит примерно так:
/home
/joseph
/myWorkspace
/projectName
manage.py
/projectName
__init__.py
urls.py
settings.py
/someapp
__init__.py
views.py
tests.py
/someotherapp
/ ... and so on ...
Когда я открываю оболочку через manage.py shell
, импортирую sys и печатаю sys.path, первым каталогом в этом списке будет /home/joseph/myWorkspace/projectName
, и мне это кажется правильным. Остальная часть пути python выглядит вполне нормально, указывая на разные пакеты сайта и т. д.
Однако, когда я запускаю свой тест сверху через manage.py test someapp
, если я печатаю sys.path в pdb, я вижу, что мой путь python сначала содержит /home/joseph/myWorkspace
, а также /home/joseph/myWorkspace/projectName
. Мне это не кажется правильным, и я думаю, что это может быть причиной того, что у меня проблемы с двойным импортом.
Я не устанавливаю PYTHONPATH в переменных среды. Насколько я знаю, я также не вношу никаких изменений в sys.path в своих приложениях или настройках.
Я не знаю, куда идти отсюда, может ли кто-нибудь дать некоторое представление?
sys.path
вmanage.py
, чтобы отловить все попытки его модификации. - person Mikko Ohtamaa   schedule 08.05.2014