lask.cli.NoAppException: 在导入 "app" 时引发了 ImportError 错误。

5

1. 我正在尝试构建一个 Flask 项目,并尝试将类导入 models.py,并将路由导入 app.py。当我尝试运行项目时,它显示了一些错误信息。以下是 traceback 的信息:

Traceback (most recent call last):
  File "/Users/cheliang/Desktop/project/env/lib/python3.8/site-packages/flask/cli.py", line 240, in locate_app
    __import__(module_name)
  File "/Users/cheliang/Desktop/project/app.py", line 4, in <module>
    from user import routes
  File "/Users/cheliang/Desktop/project/user/routes.py", line 1, in <module>
    from user.models import User
ImportError: cannot import name 'User' from 'user.models' (/Users/cheliang/Desktop/project/user/models.py)

我的项目的树形结构:

├── app.py
├── env
── run
├── static
│   ├── css
│   │   ├── normalize.css
│   │   └── styles.css
│   └── js
│       ├── jquery.js
│       └── scripts.js
├── templates
│   ├── base.html
│   ├── dashboard.html
│   └── home.html
└── user
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-38.pyc
    │   ├── models.cpython-38.pyc
    │   └── routes.cpython-38.pyc
    ├── models.py
    └── routes.py

2.下面是代码细节: models.py:

from flask import Flask, jsonify
class User:
    def signup(self):

        user = {
         "_id":"",

         "name":"",
         "email":"",
         "password":""

        }
        return jsonify(user),200

这是routes.py文件:

from user.models import User
from flask import Flask
from app import app 

@app.route('/user',methods=["GET"])
def signup(self):
    return User().signup()

这是 app.py 的代码:

from flask import Flask ,render_template

app = Flask(__name__)
from user import routes

@app.route('/')
def home():
    return render_template('home.html')

@app.route('/dashboard')
def dashboard():
    return render_template('dashboard.html')
1个回答

9
考虑到极简的Flask应用程序,可以考虑以下结构:
project_folder
    |---------- app.py
    |---------- config.py
    |---------- .env
    |---------- requirements.txt
    |---------- .flaskenv
    |---------- app/
                  |------ routes.py
                  |------ models.py
                  |------ __init__.py
                  |------ forms.py
                  |------ templates/
                              |-------- home.html
                              |-------- base.html
                              |-------- dashbooard.html
                  |------ static/
                            |-------css/
                                     |------- styles.css
                                     |------- normalize.css
                            |-------js/
                                     |------- jquery.js
                                     |------- scripts.js

创建应用程序实例:
# __init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

from app import routes, models

使用 Flask 模型:

# models.py

from app import db

class User(object):
    username = db.Column(db.String())
    # ...

# routes.py

from flask import render_template
from app import app 
from app.models import User
from app.forms import <your-form>

@app.route('/')
def home():
    return render_template('home.html')

@app.route('/dashboard')
def dashboard():
    return render_template('dashboard.html')

@app.route('/user',methods=["GET"])
def signup():
    # ...
    user = User.query.filter_by(username=form.username.data)

最后,在app.py中创建Flask应用程序的入口点:

from app import app

为什么我应该从app.py文件中的__init__.py导入应用程序?我的意思是在routes.py中你也这样做,但这不是有点双向吗?作为入口点,你从较低级别导入app,而在routes.py的情况下,你从相同的地方导入它。按照更具层次结构的方法,在app.py文件中初始化Flask应用程序不是更有意义吗? - Ndrslmpk
@Ndrslmpk,我上面的方法遵循了关注点分离原则。我有意将应用程序打包成模块。一个示例模块是在__init__.py中初始化应用程序。app是我在__init__.py中创建的flask对象。要使用它,我必须显式地将其导入其他模块,就像你在routes.py中正确地注意到的那样。 - Gitau Harrison
使用这种方法,显然,Flask需要知道从哪里开始。这就是为什么我有文件app.py的唯一目的是作为应用程序的入口点。您可以将整个应用程序捆绑在顶级文件app.py中,因此摆脱了使用模块的概念,这仍然可以,但是如果您打算创建一个更大的应用程序,分离它们会更容易。 - Gitau Harrison

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