2017-08-02 20 views
0

私は実行しようとしているフラスコのアプリケーションを持っています。私はPythonのapp.pyを実行すると、いくつかの並べ替えの循環インポートがあるようだ。ここに私のmodels.pyとapp.pyの両方のためのコードは次のとおりです。Flask python app.pyは実行されませんがmanage.py runserverは実行します

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'ではなく 'running.py 'コードを実行することができます。私の推測では、manage.pyはapp.pyに接続されていないため、動作しています。 –

+0

さんがmanage.pyを追加しました – rishubk

+0

あなたのmanage.pyがどのように機能しているかわかりません。しかし、共有しているリンクのようにコードを再構成する必要があります。それと、app.pyは修正されるはずです。 –

答えて

1

models.pyであなたがインポートされます:あなたはモデルをインポートしているapp.pyで

from app import bcrypt, db 

を。ここに示すように、プログラムを再構築それを修正する

from models import User 

http://flask.pocoo.org/docs/0.12/patterns/sqlalchemy/

データベースの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) 

としてmodels.pyでこれを使用
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

関連する問題