帮助,我有这个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个文件在测试文件夹中彼此相邻。
谢谢
答案 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)