2011-06-18 12 views
0

私はPylonsでアプリケーションを作成しています。私は認証スキームを追加したいと思います。私はレポを選んだ。pylonsに宣言構文を持つrepoze.whatを使用する

http://wiki.pylonshq.com/display/pylonscookbook/Authorization+with+repoze.what

問題がlib/auth.pyに、私は、ユーザー、グループ、および許可のためのモデルを含める必要があるということです:私はPylonsのクックブックからのチュートリアルに従いました。私が展開する際のモデルに宣言型のベースを使用して、それは私にエラーを与える:

sqlalchemy.exc.UnboundExecutionError: No engine is bound to this Table's MetaData. 
Pass an engine to the Table via autoload_with=<someengine>, or associate the MetaData 
with an engine via metadata.bind=<someengine> 

私はここに同様の問題が見つかりました:

SQLAlchemy declarative syntax with autoload (reflection) in Pylons

を私は別の中で宣言した承認のためのすべてのモデルを持っていますファイルは__init__.pyです。私は上記質問からのすべての兆候にも従ったが、まだ間違ったことがある。 誰かが解決策を見つけましたか?

答えて

0

モデル__init__.pyでは、エンジンをセッションにバインドする必要があります。

def init_model(engine): 
    """Call me before using any of the tables or classes in the model""" 
    ## Reflected tables must be defined and mapped here 
    #global reflected_table 
    #reflected_table = sa.Table("Reflected", meta.metadata, autoload=True, 
    #       autoload_with=engine) 
    #orm.mapper(Reflected, reflected_table) 

    session = orm.sessionmaker(bind=engine, autoflush=True, autocommit=False) 
    meta.metadata.bind = engine 
    meta.engine = engine 
    meta.Session = orm.scoped_session(session) 

資源: http://docs.pylonsproject.org/projects/pylons_framework/dev/advanced_models.html

+0

これは機能しません。私のinit_model()は次のようになります: 'def init_model(エンジン): " ""モデルのテーブルやクラスを使用する前に電話してください "" Session.configure(bind = engine) meta.engine = engine Base.metadata.bind = engine' 私はrepozeがミドルウェアとして機能することを指摘するのを忘れていました。 middleware.pyには、私のアプリケーションのいくつかのモデル(認可用)を含むメソッドが含まれています。そして、私が理解するように、init_model()が呼び出される前にモデルがロードされます。これは競合を引き起こす。 – hesler

+0

テーブル( 'some_table'、meta、autoload = True、autoload_with = engine)を読み込んだとき、あなたが見逃しているのは、autoloadとautoload_with argsです。 – webjunkie

0

私は解決策を見つけたと思います。私はちょうど認可のためのモデルを含むモジュールのエンジンを作成し、それをメタデータにバインドします。なぜ私はinit_modelがこれを単独でやっていないのか分かりません。したがって、これは宣言的構文の問題ではありません。ご迷惑をおかけして申し訳ありません。

関連する問題