Структура Flask — не удается импортировать приложение из __init__.py

#python #flask

#python #flask

Вопрос:

Я новичок в Python, и у меня было много проблем с настройкой структуры моих приложений с помощью __init__.py даже после поиска по нескольким руководствам.

На данный момент моя текущая структура каталогов выглядит следующим образом

 /parent
   /myapp
       __init__.py
       views.py
   /virtualenv
  

Ранее у меня было (если это имеет какое-либо значение)

 /parent
   /myapp
   /bin
   /include
   /lib
  

Содержимое __init__.py приведено ниже:

  from flask import Flask
 app = Flask(__name__)
  

и мой views.py

  from myapp import app
 @app.route('/')
 def test():
    return 'This is a new test'

 if __name__ == '__main__':
    app.run(debug=True)
  

Если myapp инициализируется с помощью init-файла, почему я не могу вызвать его в представлениях? Я получаю сообщение об ошибке «Я не могу импортировать приложение, и у меня нет модуля с именем myapp». Если я удалю файл инициализации и скопирую содержимое в верхнюю часть views.py файл, все работает нормально.

Комментарии:

1. возможно, вы также захотите рассмотреть возможность использования шаблона «фабрика приложений» для того, что вы пытаетесь сделать. у fbone есть отличный пример этого. Если вы хотите чего-то попроще, вот что я обычно использую. github.com/DarkCrowz/innovation_center/blob/master /…

2. @corvid ссылка DarkCrowz недоступна, вы можете найти и обновить ее?

Ответ №1:

Вы используете views в качестве основного скрипта. Вы не можете поместить скрипт внутрь пакета; каталог, в котором он находится, не может рассматриваться как таковой. Python добавляет parent/myapp каталог к пути Python, а не к parent пути.

Добавьте отдельный скрипт на верхнем уровне (рядом с myapp ):

 from myapp import app

if __name__ == '__main__':
    app.run(debug=True)
  

и добавьте импорт в __init__.py , чтобы импортировать ваши представления:

 from flask import Flask
app = Flask(__name__)

import views
  

и удалите if __name__ == '__main__': блок из views.py .