2

https://stackoverflow.com/a/6230083/1241454に記載されているように、os.environ dict を変更して、Google App Engine にログインしているユーザーをシミュレートしようとしていました。

from google.appengine.api import users
import webapp2
import os

class TestPage(webapp2.RequestHandler):
    def get(self):
        os.environ['USER_EMAIL'] = 'a@b.c'
        user = users.get_current_user()
        self.response.out.write(user.email())

これはうまくいきません。get_current_user()上記の例では、少なくとも開発サーバーで実行している場合は None を返します。testbed.setup_env()os.environ を直接編集するのではなく、使用しても同じ結果が得られます。ただし、以下機能します。

from google.appengine.api import users
import webapp2
import os

class TestPage(webapp2.RequestHandler):
    def get(self):
        os.environ['USER_EMAIL'] = 'a@b.c'
        reload(users)
        user = users.get_current_user()
        self.response.out.write(user.email())

唯一の変更は、os.environ の変更後にユーザー モジュールをリロードすることでした。これは予期された動作ですか、それとも App Engine の設定に何か問題がありますか? 私の理解では、Python / App Engine は、システムにロードされた os モジュールのコピーを 2 つではなく 1 つだけロードする必要があります。

何か案は?これは私を非常に混乱させます。

4

2 に答える 2

4

あなたはほとんどそこにいます。必要なのは に渡すoverwrite=Trueことtestbed.setup_env()です。

通常、「ヘルパー」メソッドを作成します。たとえばlogin_user、次のようなものです。

def login_user(self, email, user_id, is_admin=False):
    self.testbed.setup_env(user_email=email or '', overwrite=True)
    self.testbed.setup_env(user_id=str(user_id) or '', overwrite=True)
    self.testbed.setup_env(user_is_admin='1' if is_admin else '0', overwrite=True)

def logout_user(self):
    self.login_user(None, None)

OAuth でも機能します (それも必要な場合):

def login_user(self, email, user_id, is_admin=False):
    self.testbed.setup_env(oauth_error_code='', overwrite=True)
    self.testbed.setup_env(oauth_email=email, overwrite=True)
    self.testbed.setup_env(oauth_user_id=str(user_id) or '', overwrite=True)
    self.testbed.setup_env(oauth_auth_domain='example.com', overwrite=True)
    self.testbed.setup_env(oauth_is_admin='1' if is_admin else '0', overwrite=True)
于 2012-04-03T08:27:02.660 に答える
1

明確にするために、os.environは、処理中のリクエストのためにWSGI 互換フレームワーク (この場合はwebapp2 )に渡される WSGI 環境 (または Python 2.5 の CGI) です。

http://foo-shop.appspot.comにアクセスすると、すべての WSGI 値の例を確認できます。これは、すべての WSGI 値を表示する Python 2.7 の単純な WSGI アプリです。また、すべての USER_* 値は、認証に Google アカウントを使用することに固有のようです。http://www.wsgi.org/en/latest/definitions.htmlにはそれらについての言及はありません。

https://developers.google.com/appengine/docs/python/tools/localunittesting#Changing_the_Default_Environment_Variablesで、ドキュメントはself.setup_env() を使用してテスト専用の環境変数を変更することを推奨しています...そして私はテストのみだと思います。これは、テスト以外の環境でアプリケーションが行うべきことではありません。

于 2012-04-03T05:29:42.183 に答える