我是flask的新手,当flask_lab文件夹中的flask run
时,我遇到了以下导入相关的AttributeError。
如有任何帮助,我们将不胜感激。
工作目录:
flask_lab
├── __init__.py
├── Pipfile
├── Pipfile.lock
├── README.md
├── tmp
│ ├── __init__.py
│ └── test.py
└── app.py
flask_lab/app.py:
import os
import click
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import flask_lab.tmp.test.demo
app = Flask(__name__)
prefix = 'sqlite:////'
app.config['SQLALCHEMY_DATABASE_URI'] = prefix + os.path.join(app.root_path, 'data.db')
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20))
flask_lab.tmp.test.demo()
flask_lab/tmp/test.py:
import flask_lab.app
print(flask_lab.app.db)
def demo():
print('yeah!')
错误:
Traceback (most recent call last):
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/bin/flask", line 10, in <module>
sys.exit(main())
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/flask/cli.py", line 894, in main
cli.main(args=args, prog_name=name)
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/flask/cli.py", line 557, in main
return super(FlaskGroup, self).main(*args, **kwargs)
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/click/decorators.py", line 64, in new_func
return ctx.invoke(f, obj, *args, **kwargs)
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/flask/cli.py", line 767, in run_command
app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/flask/cli.py", line 293, in __init__
self._load_unlocked()
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/flask/cli.py", line 317, in _load_unlocked
self._app = rv = self.loader()
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/flask/cli.py", line 377, in load_app
raise_if_not_found=False)
File "/home/huafeng/.local/share/virtualenvs/flask_lab-x_qc9OjH/lib/python3.6/site-packages/flask/cli.py", line 235, in locate_app
__import__(module_name)
File "/home/huafeng/Desktop/flask_lab/app.py", line 7, in <module>
import flask_lab.tmp.test.demo
File "/home/huafeng/Desktop/flask_lab/tmp/test.py", line 3, in <module>
print(flask_lab.app.db)
AttributeError: module 'flask_lab' has no attribute 'app'
从 stackoverflow 收到关于代码过多且细节不足的投诉...更多字,更多字...
最佳答案
在解释 app.py
时,如果 python 解释器遇到一行 import Flask_lab.tmp.test.demo
那么它将立即开始解释 tmp/test.py。但 tmp/test.py 再次导入flask_lab。
此时,由于解释器已经遇到了flask_lab,因此它将开始在该命名空间中搜索app
。但它从未达到那条线。由于您在模块中定义 app
之前已经导入了 tmp.test
,因此尚不存在 flask_lab.app
,因此会出现错误。
如果您直接调用 tmp.test,您也会遇到循环导入错误。
所以出路是避免循环导入场景。将 db 对象移至单独的模块并在这两个模块中调用它。 Flask-SQLAlchemy 提供了一个名为 init_app
的方法,该方法适用于此类用例。
让我们创建一个名为 common 的模块,它将包含公共(public)变量。
flask_lab/common.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
flask_lab/app.py:
import os
import click
from flask import Flask
from .common import db
from .tmp.test import demo
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20))
app = Flask(__name__)
prefix = 'sqlite:////'
app.config['SQLALCHEMY_DATABASE_URI'] = prefix + os.path.join(app.root_path, 'data.db')
db.init_app(app)
demo()
flask_lab/tmp/test.py:
from .common import db
print(db)
def demo():
print('yeah!')
请注意,我还用相对导入替换了 flask_lab
导入。他们更干净。包内的代码应避免在导入中使用包名称。这样,如果您稍后更改包名称,则无需更改其中的所有代码即可执行此操作。
关于python-3.x - Flask属性错误: module object has no attribute 'app' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55708257/