Wystąpił problem z okrężnym importowaniem, więc przeniosłem import wzorca poniżej definicji mojej aplikacji. Nadal jednak wystąpił błąd importu.Jaki jest poprawny sposób rozwiązania tego błędnego błędu importu kolistego za pomocą schematu kolby?
Traceback (most recent call last):
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 2217, in <module>
globals = debugger.run(setup['file'], None, None)
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1643, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/Users/benjamin/Documents/Projects/website/server/app/app.py", line 15, in <module>
from views import site
File "/Users/benjamin/Documents/Projects/website/server/app/views.py", line 2, in <module>
from models import User
File "/Users/benjamin/Documents/Projects/website/server/app/models.py", line 3, in <module>
from database_setup import db
File "/Users/benjamin/Documents/Projects/website/server/app/database_setup.py", line 1, in <module>
from app import app
File "/Users/benjamin/Documents/Projects/website/server/app/app.py", line 15, in <module>
from views import site
ImportError: cannot import name site
Jeśli przenieść import Blueprint i rejestracyjne if __name__ == '__main__':
, problem zniknie, ale nie jestem pewien, czy to dobry pomysł.
if __name__ == '__main__':
from views import site
app.register_blueprint(site)
app.run()
Czy to jest właściwy sposób rozwiązania problemu, czy istnieje inne rozwiązanie?
oryginalny app.py
bez __main__
"naprawić":
from flask import Flask
app = Flask(__name__)
from views import site
app.register_blueprint(site)
if __name__ == '__main__':
app.debug = True
app.run()
views.py
:
from flask import Blueprint, render_template
site = Blueprint('site', __name__, template_folder='templates', static_folder='static')
@site.route('/', methods=['GET', 'POST'])
def index():
return render_template('index.html')
database_setup.py
:
from app import app
from flask_mongoengine import MongoEngine
app.config['MONGODB_SETTINGS'] = {'db': 'mst_website'}
db = MongoEngine(app)
models.py
:
from database_setup import db
class User(db.Document):
# ...
Moja struktura pliku jest:
/server
|-- requirements.txt
|-- env/ (virtual environment)
|-- app/ (my main app folder)
|-- static/
|-- templates/
|-- __init__.py
|-- app.py
|-- database_setup.py
|-- models.py
|-- views.py
Poprzez umieszczenie importu i wywołanie funkcji 'register_blueprint' wewnątrz instrukcji if, twój projekt nie zostanie zarejestrowany, jeśli uruchomisz aplikację bez bezpośredniego wykonywania pliku (np. Z uwsgi). – dirn
@dirn Czy nie to właśnie zrobiłem, umieszczając import wewnątrz 'if __name__ == '__main __':'? – benjaminz
Mówi, że poprzez umieszczanie rzeczy w tym strażniku, to tylko wtedy, gdy wykonasz plik bezpośrednio. Podczas korzystania z prawdziwego serwera aplikacji tak się nie stanie, więc wszystkie twoje plany będą "zaginione". – davidism