Циклический импорт в приложении python

#python #flask

#python #flask

Вопрос:

Я начинаю изучать python и следую этому руководству по настройке Flask, но у меня возникли некоторые проблемы с пониманием автора в том, как он размещает свои файлы. Из того, что я могу собрать, похоже, что я столкнулся с проблемой циклического импорта, и я не могу с этим справиться.

Файлы настроены следующим образом:

__init__.py

 from flask import Flask
app = Flask(__name__)

app.config['SECRET_KEY'] = "something here";
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite://app.db"
  

app.py

 from flask import render_template, request, redirect, url_for, abort, session
from app import app

@app.route('/')
.... some stuff here
  

models.py

 from flask.ext.sqlalchemy import SQLAlchemy
from app import app

db = SQLAlchemy(app)

class User(db.Model):
.... some stuff here
  

manage.py

 #!/usr/bin/env python
from flask.ext.script import Manage, Shell, Server 
from app import app

manage = Manager(app)
manager.add_command("runserver", Server())
manager.add_command("shell", Shell())

@manager.command
def createdb():
   from app.models import db
   db.create_all()

manager.run()
  

Первая ошибка заключается в невозможности запуска сервера при запуске manage.py запустить сервер. Я смог сделать это изначально, пока не переключил файлы вокруг инициализированного приложения внутри init.py (первоначально у меня все было расположено в app.py ). Я получаю сообщение об ошибке —

ImportError: cannot import name app

Это в стороне, если я исключу init.py и запустите и запустите сервер, я не могу создать базу данных, потому что получаю сообщение об ошибке с указанием —

Import Error: no module named models при запуске manage.py createdb

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

1. Вы пытаетесь импортировать приложение из приложения в приложение ?…

2. Связано ли это с тем, как называются каталоги? У меня есть родительская папка с именем «app», в то время как в руководстве родительская папка называется «example» и использует «из примера приложения для импорта», поэтому я записал ее как «из приложения для импорта приложений»

3. from x import y означает «из модуля x импортировать имена. Действительно ли ваш файл инициализации вызывается точно init.py ? Так и должно быть __init__.py . Его цель — преобразовать каталог в пакет. Обычно вы не вкладываете в него много / никакого кода.

4. Да, его имя init . Таким образом, приложение для импорта приложений подразумевает импорт приложения (объекта flask) из app.py файл?

5. Ну, да, но само по себе это ничего не значит. Переименуйте свой init.py файл в __init__.py и прочитайте еще одно руководство, а также прочитайте docs.python.org/2/tutorial/modules.html