首页 > 解决方案 > ImportError:无法导入名称“UserModel”

问题描述

帮助,我有这个appp.py文件:

from flask import Flask, jsonify, request, make_response
import json
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy
import models,resources

app = Flask(__name__)
api = Api(app)

api.add_resource(resources.UserRegistration, '/registration')
api.add_resource(resources.UserLogin, '/login')
api.add_resource(resources.UserLogoutAccess, '/logout/access')
api.add_resource(resources.UserLogoutRefresh, '/logout/refresh')
api.add_resource(resources.TokenRefresh, '/token/refresh')
api.add_resource(resources.AllUsers, '/users')
api.add_resource(resources.SecretResource, '/secret')

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'waaahawhawaahhawhaw'

db = SQLAlchemy(app)

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

@app.route('/')
def index():
    return jsonify({'message': 'Hell to the World!'})

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

这是models.py文件:

from appp import db

class UserModel(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(120), unique = True, nullable = False)
    password = db.Column(db.String(120), nullable = False)

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

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

resources.py文件

from flask_restful import Resource, reqparse
from models import UserModel

parser = reqparse.RequestParser()
parser.add_argument('username', help = 'This field cannot be blank', required = True)
parser.add_argument('password', help = 'This field cannot be blank', required = True)

class UserRegistration(Resource):
    def post(self):
        data = parser.parse_args()

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

        new_user = UserModel(
            username = data['username'],
            password = data['password']
        )
        try:
            new_user.save_to_db()
            return {
                'message': 'User {} was created'.format( data['username'])
            }
        except:
            return {'message': 'Something went wrong'}, 500

一旦我尝试运行应用程序,我就会收到以下错误消息:

ImportError:无法导入名称“UserModel”

事实上,我发现了像我这样的其他问题,他们帮助我理解了为什么会出现这个错误,但他们都没有帮助我解决这个问题。我的猜测是python(或flask)无法从model.py加载类UserModel,因为model.py(或class UserModel)仍在初始化,它需要来自appp.py的db,它正在等待resources.py,而这不能加载因为它正在等待models.py。如何解决这个问题????顺便说一句,我对这一切都很陌生,我只是在关注本教程

这是项目结构

test
|---appp.py
|---models.py
|---resources.py

这 3 个文件在 test 文件夹中彼此相邻。

谢谢

标签: pythonflask

解决方案


您必须创建一个单独的文件来编写 db 语法,然后将其导入模型中

在 db.py 中:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

在 app.py 的 main 上,您可以输入以下代码:

if __name__=='__main__':
    from db import db
    db.init_app(app)
    app.run(port=5000)

推荐阅读