2017-08-02 128 views
0

我有一个烧瓶应用程序,我试图运行。当我运行python app.py时,似乎有某种类型的循环导入。这里是我的两个models.py和app.py代码:Flask python app.py does not run but manage.py runserver does

models.py

import datetime 
from app import bcrypt, db 

class User(BaseModel, db.Model): 
    __tablename__ = "users" 

    id = db.Column(db.Integer, primary_key=True, autoincrement=True) 
    email = db.Column(db.String(255), unique=True, nullable=False) 
    password = db.Column(db.String(255), nullable=False) 
    registered_on = db.Column(db.DateTime, nullable=False) 
    admin = db.Column(db.Boolean, nullable=False, default=False) 

    def __init__(self, email, password, admin=False): 
     self.email = email 
     self.password = bcrypt.generate_password_hash(password) 
     self.registered_on = datetime.datetime.now() 
     self.admin = admin 

app.py

from flask import Flask, render_template 
from flask import request, jsonify, session 
from flask.ext.bcrypt import Bcrypt 

from flask_sqlalchemy import SQLAlchemy 
from models import User 

app = Flask(__name__) 
db = SQLAlchemy() 

POSTGRES = { 
    'user': 'postgres', 
    'db': 'postgres', 
    'host': 'localhost', 
    'port': '5432', 
} 
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://%(user)[email protected]%(host)s:%(port)s/%(db)s' % POSTGRES 
app.config['SECRET_KEY'] = 'lol' 

bcrypt = Bcrypt(app) 

db.init_app(app) 

@app.route('/api/register', methods=['POST']) 
def register(): 
    json_data = request.json 
    user = User(
     email=json_data['email'], 
     password=json_data['password'] 
    ) 
    try: 
     db.session.add(user) 
     db.session.commit() 
     status = 'success' 
    except: 
     status = 'this user is already registered' 
    db.session.close() 
    return jsonify({'result': status}) 

manage.py

from flask_script import Manager 
from flask_migrate import Migrate, MigrateCommand 
from app import app, db 
from models import User 

migrate = Migrate(app, db) 
manager = Manager(app) 

manager.add_command('db', MigrateCommand) 

@manager.command 
def create_admin(): 
    """Creates the admin user.""" 
    db.session.add(User(email='[email protected]', password='admin', admin=True)) 
    db.session.commit() 

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

我已经打得四处进口,但似乎没有任何工作,我通常会得到一个圆形导入错误是这样的:

Traceback (most recent call last): 
    File "app.py", line 7, in <module> 
    from models import User 
    File "/Users/Rishub/Desktop/apps/topten/models.py", line 3, in <module> 
    from app import bcrypt, db 
    File "/Users/Rishub/Desktop/apps/topten/app.py", line 7, in <module> 
    from models import User 
ImportError: cannot import name User 

有谁知道解决这个? 另外,如果我运行python manage.py runserver,我的应用运行良好,所以我很好奇为什么这个工程,但python app.py不。

+0

共享'manage.py'代码,所以我们可以说如何运行而不是'app.py'。我的猜测是manage.py没有连接到app.py,因此它正在工作。 –

+0

刚刚添加manage.py – rishubk

+0

我不知道你的manage.py是如何工作的。但你需要重新构建你的代码,因为我分享的链接说。那样做和app.py应该得到修复。 –

回答

1
在models.py

您导入:

from app import bcrypt, db 

在app.py您导入模型。

from models import User 

要修复它调整计划,如下所示:http://flask.pocoo.org/docs/0.12/patterns/sqlalchemy/

创建models.py与数据库CONFIGS等一个database.py文件

from sqlalchemy import create_engine 
from sqlalchemy.orm import scoped_session, sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 

engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True) 
db_session = scoped_session(sessionmaker(autocommit=False, 
             autoflush=False, 
             bind=engine)) 
Base = declarative_base() 
Base.query = db_session.query_property() 

def init_db(): 
    import models 
    Base.metadata.create_all(bind=engine) 

以此为

from database import Base 
from sqlalchemy import Column, Integer, String 

# instead of db.column directly use Column 

class User(Base): 

和应用文件为:

from database import init_db 
init_db() 
from database import db_session 
from models import User 

@app.route('/api/register', methods=['POST']) 
def register(): 
    json_data = request.json 
    user = User(
     email=json_data['email'], 
     password=json_data['password'] 
    ) 
    db_session.add(user) 
    db_session.commit() 
    return jsonify({'result': 'success'}) 
+0

我有一个类BaseModel(db.Model):但没有db,我该怎么做? – rishubk

+0

添加了您应该用于'class User(Base)的代码段:' –

+0

是否没有像“app = Flask(__ name__)”这样的实际应用程序实例?我仍然感到困惑,我会如何使用bcrypt,就像我上面 – rishubk