ImportError:无法导入名称“ UserModel”

时间:2019-03-09 23:59:32

标签: python flask

帮助,我有这个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'

的确,我发现了其他问题,例如我的问题,他们帮助我理解了为什么我遇到此错误,但是没有一个人帮助我解决该问题。 我的猜测是,由于model.py(或类UserModel)仍在初始化中,因此python(或flask)无法从model.py加载类UserModel,并且需要appp.py中的db它正在等待无法加载的resources.py,因为它正在等待models.py。 如何解决这个问题?顺便说一句,我是这一切的新手,我只是关注this tutorial

这是项目结构

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

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

谢谢

2 个答案:

答案 0 :(得分:0)

为了扩展,这是我评论中的一个示例。

from test.models import User, Role, UserRoles,\
Regions, RegionAttributes, CityAttributes,\
UserAttributes, SkillTracker, RegionWar,\
Articles

您要求我解释与导入的区别。

我不确定这是否可以用几句话解释,但是请尽我所能避免过于复杂。

您有一个名为test的项目文件夹,并且将这个文件夹缠绕为models.py。由于models文件位于test文件夹中(在这种情况下,test是一个模块),因此您要在文件中的项目目录中导入一个类,最终看起来像这样:

from test import models

--test

   |

    --models.py

用简单的英语说,这意味着从测试文件夹中,我要导入文件models.py

希望这可以增加一些清晰度,这将是一个很好的谷歌搜索,我敢肯定那里还有更多更好的解释,而且我可能会漏掉一些东西。

一种方法行不通的原因是,您必须从模块导入,而应用程序,模型和UserModel不是模块。

答案 1 :(得分:0)

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

在db.py中:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

在app.py的主目录中,您可以输入以下代码:

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