#python #python-3.x #flask #flask-restful
#python #python-3.x #колба #колба-restful
Вопрос:
Я пытаюсь настроить приложение flask, которое работает на Python 3.7.x. Я ссылался на множество онлайн-руководств, но, похоже, не могу разрешить эту ошибку ModuleNotFoundError, и ни один из вопросов stackoverflow не связан.
Ниже приведена структура моего проекта:
project/
app/
__init__.py
api.py
conf.py
models.py
schema.py
orders-mgmt.toml
requirements.txt
README.md
# app/__init__.py
from flask import Flask
from flask_restful import Api
from app.conf import load_from_toml
import logging
import os.path
if os.path.isfile('/opt/project/orders-mgmt.toml'):
config = load_from_toml('/opt/project/orders-mgmt.toml')
else:
config = load_from_toml()
app = Flask(__name__)
api = Api(app)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = config['mysql']['db_uri']
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
'pool_recycle': 3000,
'pool_pre_ping': True,
}
# app/api.py
from flask import jsonify
from flask_restful import Resource
from flask_sqlalchemy import SQLAlchemy
from app import app, api, config #ERROR here
from app.models import Request
from app.schema import RequestSchema
db = SQLAlchemy(app)
class TestGet(Resource):
def get(self):
return 'okay'
api.add_resource(TestGet, '/')
if __name__ == '__main__':
app.run(debug=True, host='localhost', port=5000)
Я получаю ModuleNotFoundError
входящую app/api.py
строку from app import app, api, config
при запуске python app/api.py
:
$ python app/api.py
Traceback (most recent call last):
File "app/api.py", line 4, in <module>
from app import app, api, config
ModuleNotFoundError: No module named 'app'
Могу ли я узнать, в чем проблема с моим приложением flask?
Комментарии:
1. Должен входить только код инициализации пакета
__init__.py
. Поскольку вы не используетеapp
как пакет, он должен быть пустым или вообще отсутствовать.
Ответ №1:
У вас проблема с циклической зависимостью, ваше приложение не будет работать в такой структуре файлов, удалите логику из модуля инициализации в другой, или вам нужно будет удалить весь абсолютный импорт (импорт для ваших собственных модулей) и заменить их относительным
для __init__
модуля
замените эту строку:
from app.conf import load_from_toml
с
from .conf import load_from_toml
для app
модуля
замените эти строки:
from app import app, api, config #ERROR here
from app.models import Request
from app.schema import RequestSchema
с
from . import app, api, config
from .models import Request
from .schema import RequestSchema
Комментарии:
1. Я получаю
ImportError: cannot import name 'app' from '__main__'
из строкиfrom . import app, api, config
2. @kaiilim Я предлагаю вам изменить структуру проекта. Удалите всю логику из
__init__
модуля и поместите в app/app.py модуль. Оставьте__init__
модуль просто пустым