【问题标题】:AttributeError when importing flask-SQLAlchemy model导入flask-SQLAlchemy模型时出现AttributeError
【发布时间】:2020-07-28 11:13:52
【问题描述】:

我正在按照this 教程构建一个基于 JWT 的身份验证系统。

app.py:

from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'd0cad49580952003e6ae01499c7bb190a4b4f9a5babd866f47064707f7b78506'

api = Api(app)
db = SQLAlchemy(app)


@app.before_first_request
def create_tables():
    db.create_all()


import resources, models

api.add_resource(resources.UserRegistration, '/registration')


if __name__ == '__main__':
    app.run()

models.py:

from app import db


class UserModel(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(150), nullable=False)
    email = db.Column(db.String(100), unique=True, nullable=False)

    def __init__(self, name, password, email):
        self.name = name
        self.password = password
        self.email = email

    @classmethod
    def find_by_username(cls, username):
        return cls.query.filter_by(username=username).first()

    def save_to_db(self):
        db.session.add(self)
        db.session.commit()

resources.py:

from flask_restful import Resource, reqparse
from models import UserModel


class UserRegistration(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('name', help='This field cannot be blank', required=True)
        parser.add_argument('email', help='This field cannot be blank', required=True)
        parser.add_argument('password', help='This field cannot be blank', required=True)

        data = parser.parse_args()

        if UserModel.find_by_username(data['name']):
            return {'message': 'User {} already exists'.format(data['name'])}

        new_user = UserModel(
            name=data['name'],
            password=data['password'],
            email=data['email']
        )
        try:
            new_user.save_to_db()
            return {
                'status': 'User {} was created'.format(data['username'])}

        except:
            return {'message': 'Something went wrong'}, 500

当我运行 app.py 时,我收到以下错误:

Traceback (most recent call last):
  File "G:\python\PycharmProjects\vumonic\app.py", line 19, in <module>
    import resources, models
  File "G:\python\PycharmProjects\vumonic\resources.py", line 2, in <module>
    from models import UserModel
  File "G:\python\PycharmProjects\vumonic\models.py", line 1, in <module>
    from app import db
  File "G:\python\PycharmProjects\vumonic\app.py", line 21, in <module>
    api.add_resource(resources.UserRegistration, '/registration')
AttributeError: module 'resources' has no attribute 'UserRegistration'

当我从 resources.py 中删除 from models import UserModel 时,此错误消失。

我无法弄清楚错误的原因。

我正在使用 Flask==1.1.2、Flask-SQLAlchemy==2.4.4 和 Flask-RESTful==0.3.8

这是我第一次开发 API,如果有任何帮助,我们将不胜感激。

【问题讨论】:

  • 你有一个循环依赖 - 应用程序导入模型导入应用程序。
  • @EugenePakhomov 我尝试删除导入模型,但对错误没有影响。

标签: python flask flask-sqlalchemy flask-restful


【解决方案1】:

您面临循环导入问题。

当 Python 导入一个模块时,它会检查模块注册表以查看该模块是否已被导入。如果模块已经注册,Python 会使用缓存中的现有对象。模块注册表是一个已初始化并按模块名称索引的模块表。该表可以通过sys.modules访问。

如果未注册,Python 会找到该模块,必要时对其进行初始化,并在新模块的命名空间中执行它。

要了解有关循环导入的更多信息,您可以阅读文章:

https://stackabuse.com/python-circular-imports/

https://www.stefaanlippens.net/circular-imports-type-hints-python.html

Miguel Grinberg 的这个教程是一个生命的救星 https://www.youtube.com/watch?v=NH-8oLHUyDc&t=3205s

【讨论】:

  • 这确实是一个循环导入问题,但它不是因为导入烧瓶引起的,因为烧瓶是一个库,我认为这是导入它的唯一方法。
  • 我忘记编辑描述了。我不得不回答类似的问题,他的脚本名称是“flask”。忘记删除线了,希望您的问题已经解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2015-01-03
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多