Google App Engine1.6.4テストベッドをFlask0.8 、特にFlask -Login 0.1パッケージ(ソース)で使用すると、コマンドライン単体テストで奇妙な問題が発生します。
以下は、問題を示す例です。コメント行(from google.appengine.ext import testbed)に注意してください。この行にコメントを付けると、テストは期待どおりに機能します。
この行のコメントが解除されると、の@login_requiredデコレータFlask-Loginはログインしたユーザーの認識を停止します。つまり、current_user.is_authenticated()Falseを返します。犯人が輸入しているようですtestbed。
#!/usr/bin/env python2.7
import unittest
import sys
from flask import Flask, current_app, url_for
from flaskext import login
sys.path.append('/usr/local/google_appengine')
# Go ahead and uncomment this:
# from google.appengine.ext import testbed
app = Flask('test')
app.secret_key = 'abc'
login_manager = login.LoginManager()
login_manager.setup_app(app)
login_manager.login_view = 'index'
class User(login.UserMixin):
    def get_id(self):
        return "1"
@login_manager.user_loader
def load_user(user_id):
    return User()
@app.route('/')
@login.login_required
def index():
    pass
@login_manager.unauthorized_handler
def unauthorized():
    raise Exception("Unauthorized.")
class MyTest(unittest.TestCase):
    def setUp(self):
        self.app = app
        self.client = app.test_client()
    def test_user(self):
        with self.app.test_request_context():
            logged_in = login.login_user(User())
            r = self.client.get('/')
if __name__ == '__main__':
    unittest.main()
具体的な例外は次のとおりです。
ERROR:test:Exception on / [GET]
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask-0.8-py2.7.egg/flask/app.py", line 1504, in wsgi_app
    response = self.full_dispatch_request()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask-0.8-py2.7.egg/flask/app.py", line 1264, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask-0.8-py2.7.egg/flask/app.py", line 1262, in full_dispatch_request
    rv = self.dispatch_request()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask-0.8-py2.7.egg/flask/app.py", line 1248, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask_Login-0.1-py2.7.egg/flaskext/login.py", line 479, in decorated_view
    return current_app.login_manager.unauthorized()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask_Login-0.1-py2.7.egg/flaskext/login.py", line 250, in unauthorized
    return self.unauthorized_callback()
  File "./test.py", line 34, in unauthorized
    raise Exception("Unauthorized.")
Exception: Unauthorized.
私が期待する動作は、インポート(および使用)がFlaskコンテキストスタックに影響を与えず、ひいては、Flask-Loginがインポートされたtestbedとしても単体テスト環境で機能し続けることです。testbed
私はこれを少し見つめていましたが、役に立たなかったので、この問題の潜在的な解決策についての洞察と提案に感謝します。
読んでくれてありがとう。