Я использую 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, этот импорт выполнен и кажется «просто работать». Однако для меня это единственный раз, когда у меня возникла проблема с этим циклическим импортом. Что я пропустил?
Как насчет того, чтобы написать 'import views' в' __init __. Py' после определенного 'app = Flask (__ name __)'? Это должно решить круговую ссылку. Дайте мне знать, если это хорошее решение для вас. –