python - 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 文件夹中彼此相邻。
谢谢
解决方案
您必须创建一个单独的文件来编写 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)
推荐阅读
- android - 带有 MPAndroid 库的 Android 中的饼图
- javascript - 我怎样才能看到 js 垃圾收集器在运行
- azure - Azure 虚拟机的 SLA
- multithreading - Spring:使用多个线程从表中获取数据
- mysql - SQL查询:[在新列中显示查询的计数]
- vim - 在 gvim 中突出显示总是粗体
- ruby-on-rails - Docker compose with Rails 和 Postgres 无法连接到服务器:没有到主机的路由是服务器
- java - Java:为每个新的数组附加元素创建类实例
- python - Pycharm:没有找到 Python;不带参数运行以从 Microsoft Store 安装
- c# - C# 用千位分隔符格式化数字,但保持小数位数不变