2016-10-09 7 views
0

web2py DALを使用してリモートデータベースにアクセスするスクリプトを作成しようとしています。私は、アプリケーションが別のweb2pyアプリケーションの認証テーブルにアクセスできるようにしたいと思います。スタンドアロンアプリケーションでDALとAuthを使用した場合のAttributeError

if MODE == 'server': 
    DIR_GLUON = '...' 
else: 
    DIR_GLUON = '...' 

sys_path.insert(0, DIR_GLUON) 

from gluon import DAL, Field, current 
from gluon.tools import Auth 
from gluon.storage import Storage 
import gluon.contrib.plural_rules as plural_rules 

# establish DB connection  
db = DAL(..., pool_size = 1, check_reserved=['all'], lazy_tables = True, fake_migrate_all = True) 

auth = Auth(db) 

最後の行は次のエラー生成します:

Traceback (most recent call last): 
    File "standalone_script.py", line 39, in <module> 
    auth = Auth(db) 
    File "C:\...\web2py\gluon\tools.py", line 1754, in __init__ 
    request = current.request 
AttributeError: 'thread._local' object has no attribute 'request' 

をスタンドアロン環境で上記のエラーを解決するために合理的な方法はありますスクリプトは次のようにありますか?ありがとうございました。

答えて

1

Authは、web2py環境外では使用できません。 auth_userテーブルへのアクセスが必要な場合は、コードで明示的に定義するのが最も簡単な方法です。適切な定義はin the bookです(フォームの提出をしない場合は、バリデータの定義を気にする必要はありません)。

DALがアプリケーションの/databasesフォルダを指すことができる場合は、明示的なテーブル定義をスキップすることもできます(アプリケーションがリモートサーバー上にある場合、リモートフォルダをマウントする可能性があります。マシンははるかに速くなります)。 (hereを説明するように)あなたのDALのセットアップは、次のようになります。

db = DAL(..., folder='/path/to/app/databases', auto_import=True) 

上記/path/to/app/databasesに移行メタデータファイルに基づいて、テーブル定義を作成します。この場合、定義にはフィールドバリデーターなどのweb2py固有の属性は含まれません(フィールド名や型、データベースの制約など、データベースに必要な属性のみが含まれます)。

最後に、あなたのコードを実行しているかに応じて、あなたのアプリケーションの環境内で実行することも可能である(あなたがアプリケーションのローカルコピーが必要になります):

python web2py.py -S yourapp -M -R /path/to/your/script.py 

上記の意志web2py実行環境を作成し、アプリケーションのモデルファイル(Authテーブルを含むデータベーステーブルを定義する)を実行し、そのコンテキストでコードを実行します。この場合、テーブル定義はあなたのアプリケーションコードから来るので、テーブル定義またはauto_importを気にする必要はありません。余談ですが、注意点として

(あなたのコードは、データベーススキーマへDALを作る変化をもたらすしたくないと仮定して)リモートでアプリケーションのデータベースに接続するとき、あなたはおそらく移行を無効にする必要があります。

db = DAL(..., migrate_enabled=False) 

その場合、fake_migrate_all=Trueの必要はありません。これは、移行を有効にし、移行メタデータファイルを生成する必要がある場合にのみ必要です。また、fake_migrate_allを使用する必要があったとしても、メタデータファイルを生成するために1回だけ使用することに注意してください(そうしないと、実行ごとに同じセットのファイルが不必要に生成されます)。

+0

ありがとう、アンソニー。私は最終的に、スクリプトでテーブルを明示的に定義し、移行を無効にしていましたが、あなたの投稿から新しいことを確かに学びました! – Boa

関連する問題