2016-05-18 3 views
0

ユーザーログインとセッションを管理するFlaskアプリケーションを構築しています。私は、ユーザーのセッションを検証しようとすると、異常なエラーに遭遇しました。 Flaskセッションを使用してユーザーの現在のsessionIdを保存すると、アプリケーションはsessionIdを使用して、データベースのセッションテーブルから現在のセッションを検索します。Flask-SQLAlchemy存在しないキーを照会するときにquery.get()が例外をスローする

これは、エラーを生成するコードです:

session_id = flask.session.get("session_id", "") 
session = models.Session.Session.query.get(session_id) 

は、これは私がSQLAlchemyのからの取得エラーです:

File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/home/gunicorn/PROJECTNAME/routes.py", line 24, in index 
    return controllers.index.indexController() 
    File "/home/gunicorn/PROJECTNAME/controllers/index.py", line 17, in indexController 
    session = models.Session.Session.query.get(session_id) 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/sqlalchemy/orm/query.py", line 831, in get 
    return self._get_impl(ident, loading.load_on_ident) 
    File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/sqlalchemy/orm/query.py", line 842, in _get_impl 
    if len(ident) != len(mapper.primary_key): 
TypeError: object of type 'NoneType' has no len() 

query.get()が中に存在しないインデックスに対して実行されたときに表示されますFlask-SQLAlchemyのAPIドキュメントではこの場合はNoneを返すはずですが、このエラーはスローされます。完全を期すため

class Session(db.Model): 
    sessionId = db.Column(db.String(32), primary_key=True) 
    userId = db.Column(db.Integer, db.ForeignKey('user.userId'), nullable=False) 
    createdOn = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now()) 

EDIT: 私のディレクトリ構造がhereをリンクされている参考

は、ここに私のセッションモデルのコードです。 run.pyは、Flask()オブジェクトが作成されて実行されるファイルです。

答えて

3

Noneget()メソッドのパラメータとして渡すと、このエラーが発生します。 SESSION_ID変数が

if session_id is not None: 
    session = models.Session.Session.query.get(session_id) 
else: 
    # do something 

か、first()方法と併せてfilter_by()方法を使用することができますを照会する前にNoneでないかどうかを確認できます。

session = models.Session.Session.query.filter_by(sessionId=session_id).first() 

見つかったない場合にはNoneを返します。

+0

私はそれが正しい方法であると確信しています。私のディレクトリ構造には、ファイルとしてSession.pyが入ったパッケージとしてのモデルがあり、Session.pyにはclass Sessionが定義されています。 –

+0

実装の詳細について教えてください。 [最小限の、完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve) –

+0

問題はありません!私はちょうどプロジェクトのディレクトリ構造のイメージを編集しました。 –

関連する問題