2016-06-17 9 views
1

からクラスをインポートできませんでした。ちょうど2つの青写真を定義した青写真に私の小さなアプリケーションを移行しました。models.py

私はこのエラーを取得しています:ImportError: cannot import name User

私はここで間違って何が起こっているのか見当がつかない。私は、循環的なインポートがないこと、またはそれが正確に何をするのかについて比較的自信があります。私は、Pythonと一般的なプログラミングの両方にかなり新しいです。

また、core.pyのインポート行をfrom users.models import *に変更すると、Webページをロードするまで動作しますが、「グローバル名ユーザーが定義されていません」というトレースバックが表示されます。同じことがusers \ views.pyのインポート行にも適用されます。

私はそれをインポートしようとしている唯一の場所はここにあります。

core.py:

from flask import Flask, g 
from flask_sqlalchemy import SQLAlchemy 
from flask.ext.login import LoginManager, current_user 
from flask.ext.bcrypt import Bcrypt 
from assets.forms import SearchAssetTag 

app = Flask(__name__) 
app.config.from_object('config') 
login_manager = LoginManager() 
login_manager.init_app(app) 

bcrypt = Bcrypt(app) 
db = SQLAlchemy(app) 

from users.models import User 

@login_manager.user_loader 
def load_user(user_id): 
    return User.query.filter(User.id == int(user_id)).first() 

#Define headersearchform globally as it runs on every page with header. 
@app.before_request 
def before_request(): 
    g.headersearchform = SearchAssetTag() 
    g.current_user = current_user 

from users.views import users_blueprint 
from assets.views import assets_blueprint 

app.register_blueprint(users_blueprint) 
app.register_blueprint(assets_blueprint) 

そして/users/views.py、私は明らかにログインし、その他もろもろのためのユーザーオブジェクトを参照する必要がで。

from flask import render_template, request, session, url_for, redirect, flash, Blueprint 
from core import app, db 
from sqlalchemy.exc import IntegrityError 
from forms import SignupForm, LoginForm 
from models import User 
from flask.ext.login import login_user, login_required, current_user, logout_user 

users_blueprint = Blueprint('users', __name__, template_folder = 'templates') 

フォルダ構造は次のようになります。

core.py 
__init__.py 
config.py 

    \users 
      __init__.py 
      views.py 
      forms.py 
      models.py 
      \templates 
       template.html 
    \assets 
      __init__.py 
      views.py 
      forms.py 
      models.py 
      \templates 
       template.html 

最後に、これはUserクラスはSQLAlchemyのために定義されているmodel.pyファイルです:

from core import db, bcrypt 

class User(db.Model): 

    __tablename__ = "users" 

    id = db.Column(db.Integer, primary_key=True) 
    first_name = db.Column(db.String, nullable=False) 
    last_name = db.Column(db.String, nullable=False) 
    email = db.Column(db.String, nullable=False) 
    title = db.Column(db.String, nullable=False) 
    password = db.Column(db.String) 

    def __init__(self, first_name, last_name, email, title, password): 
     self.first_name = first_name 
     self.last_name = last_name 
     self.email = email 
     self.title = title 
     self.password = bcrypt.generate_password_hash(password) 
+0

定義されるであろうその方法は、実際にどのようにあなたの 'model.py'が原因あなたがここでそれをコピーしたかに無効なインデントに見える、またはされていることです(いずれにしても、それは修正する必要があります)。 – Gerrat

+0

@Gerratいいえ、そうではありません。しかし、ここに固定。良いキャッチ。 – xGlorify

+2

あなたは循環インポートを持っています - 'models.py'はコアから' db'をインポートし、 'core.py'はモデルから' User'をインポートしています。 – Gerrat

答えて

3

あなたはcircular importを持っている:

models.pyは、コアからdbを輸入している、とcore.py

から Userをインポートしています core.pyの底に

from users.models import User 

:210

あなたはこの行を移動する必要があります。 models.pycoreからdbをインポートしようとすると(それがそのポイントを過ぎているので)、それは

+0

ありがとう!私はそれを行い、次に '/ users/views.py'で青写真を定義してからcore.pyに戻って他のものをインポートしなければなりませんでした。[OK]を、それは本当に表示されないです:フラスコインポートrender_template、リクエスト、セッション、なurl_for、リダイレクト、フラッシュ、青写真 users_blueprint =青写真( 'ユーザ'、__name__、template_folder = 'テンプレート') ' 編集から ':そうのようにここでは、しかし、私はあなたがそれの要点を得ると思います。 – xGlorify

関連する問題