在Flask中出现导入错误:尝试相对导入,但未知父包。

3

文件夹结构

.
├── myapp
│   ├── api
│   │   └── routes.py
│   ├── app.py
│   |
│   └── site
│       └── routes.py

app.py位于api文件夹和site文件夹之外的myapp文件夹中。

api/routes.py

from flask import Blueprint
api = Blueprint('api',__name__,url_prefix='api')

@api.route('/userlist/')
def user():
  return { 1: 'user1', 2:'user2'}

site/routes.py

from flask import Blueprint

site = Blueprint('site',__name__)

@site.route('/')
def index():
  return 'Welcome to the Home page'

app.py

from flask import Flask
from .site.routes import site
from .api.routes import api

def create_app():
  app = Flask(__name__)
  app.register_blueprint(api)
  app.register_blueprint(site)
  return app

当我在终端中使用“flask run”命令运行Flask应用程序时,出现了这个错误。

Traceback (most recent call last):
 File "app.py", line 2, in <module>
  from .site.routes import site
ImportError: attempted relative import with no known parent package

我不明白如何解决这个问题。 提前感谢您的帮助 :)


分享完整的回溯信息。 - Олег Гребчук
@Олег Гребчук 添加了 - M_x
@M_x 是 app.py,你的执行脚本,还是有另一个在 myapp 文件夹外运行项目的脚本? - sahasrara62
app.py 是执行脚本。 - M_x
myapp 中添加一个 __init__.py 文件,并在其中写入 from . import api, site,然后在 app.py 中将项目导入为 from api.routes import apifrom site.route import site - sahasrara62
1
@napuzba,谢谢你的帮助,但是错误已经通过编辑myapp/api/routes.py文件中的url_prefix='/api'url_prefix='api'而消失了。 - M_x
3个回答

3
请在每个文件夹中添加空的__init__.py文件: myapp,api,site,
然后尝试导入: from myapp.site.routes import site

谢谢您的帮助,但问题已经通过编辑 myapp/api/routes.py 文件中的 url_prefix='api'url_prefix='/api' 解决了。 - M_x

2
我认为Python认为你的import中的点是相对导入(显然找不到它)。尝试使用以下方式进行导入:(如果app.py在myapp文件夹上方)
from myapp.site.routes import site

尝试使用以下方式导入(如果app.py在您的myapp文件夹中):

尝试使用以下方式导入(如果app.py在您的myapp文件夹中):

from site.routes import site

在从site.routes中移除**.**时,出现了以下错误: ModuleNotFoundError: No module named 'site.routes'; 'site' is not a package - M_x
你的第二个解决方案是正确的,因为 OP 更新了问题陈述并且 app.pymyapp 文件夹中。 - sahasrara62
1
说实话,我有点困惑 - 现在我都包含了这两个语句,以防万一:D - Cribber
谢谢您的帮助,但是错误已经通过编辑myapp/api/routes.py文件中的url_prefix='/api'url_prefix='api'而消失了。 - M_x

0

只需要做出小改变。 旧代码:

api = Blueprint('api',__name__,url_prefix='api')

新代码:

api = Blueprint('api',__name__,url_prefix='/api')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接