2015-03-05 2 views
2

Я использую Django некоторое время, но решил дать Flask попробовать мой последний побочный проект. Поскольку я не хотел, чтобы все мое приложение было в одном файле, я выполнил документацию here, чтобы сделать мое приложение Flask в пакете. Важно отметить, что эти инструкции ввести свой род кругового импорта:Испытательная колба - избегая циркулярного импорта

Каждого Python программист ненавидит их, и все же мы просто добавили некоторые из них:. Циркулярного импорта (Это когда два модуля зависит друг от друга В этом случае views.py зависит от __init__.py). Имейте в виду, что это плохая идея в целом, но здесь она на самом деле прекрасна. Причиной этого является то, что мы фактически не используем представления в __init__.py и просто гарантируем, что модуль импортируется, и мы делаем это в нижней части файла.

Действительно, это еще не вызвало никаких проблем в моем приложении, и мое приложение не будет работать, если я удалю эту строку. Тем не менее, мой побочный проект стал достаточно большим, и я решил попробовать выполнить для него единичные тесты, используя Flask-Testing. Во всей их документации они просто from package import app как обычно, как и в каждом подмодуле в моем приложении. Тем не менее, если я уронить tests.py в главном каталоге пакета и попробовать этот импорт, а затем попробуйте запустить тесты, он терпит неудачу с круговым импортом упомянутого выше:

File "/home/me/my_app/my_app/__init__.py", line 165, in <module> 
    import views 
File "/home/me/my_app/my_app/views.py", line 23, in <module> 
    from my_app import app, db 
ImportError: cannot import name app 

В документации для Колба-тестирования, а также как и в других местах, таких как Mega-Tutorial section on Unit Testing, этот импорт выполнен и кажется «просто работать». Однако для меня это единственный раз, когда у меня возникла проблема с этим циклическим импортом. Что я пропустил?

+0

Как насчет того, чтобы написать 'import views' в' __init __. Py' после определенного 'app = Flask (__ name __)'? Это должно решить круговую ссылку. Дайте мне знать, если это хорошее решение для вас. –

ответ

0

Как документально here ваш my_app/__init__.py должен выглядеть так:

from flask import Flask 

app = Flask(__name__) 
from my_app import views 

Обратите внимание, что app определяется перед тем импорт views из пакета. Если вы выполните это правило, у вас нет циклической проблемы с импортом.

+0

'import views 'был уже последней строкой в ​​моей \ _ \ _ init__.py. Оказывается, это было связано с попыткой запустить тест с носом. Я переключился на 'unittest.main()', и он работал нормально. Все еще никогда не мог заводить нос, независимо от того, что я пробовал. –

+0

@ Two-BitAlchemist OK Я вообще не знаю носа, поэтому я не могу вам помочь ... извините. Просто подсказка: дважды проверьте свой путь python, когда вы проводите тест носа, он швыряет, что есть еще один 'my_app', который разрешен как ваш пакет. Попробуйте распечатать свой путь python непосредственно перед включением в 'views' –

+0

@ Two-BitAlchemist. У вас есть модуль' my_app' в пакете 'my_app'? Если это так, я думаю, вы падаете во втором последнем пункте, описанном здесь (https://nose.readthedocs.org/en/latest/finding_tests.html) –

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

  • Нет связанных вопросов^_^