2013-03-22 12 views
6

以下は、セッションのシリアル化のためのWERKZEUGの勧告でありますフラスコSecureCookie交換漬物は

from werkzeug.contrib.securecookie import SecureCookie 
Secure_Cookie.serialization_method = json 

UnicodeDecodeError: 'utf8' codec can't decode byte 0x97 in position 0: invalid start byte

これは、ログインしようとすると発生します。

私はjsonのエンコーダのソースに掘り下げて、ensure_ascii=Falseを設定しようとしましたが、これは上記のエラーを越えてしまいましたが、アプリケーションには全くログインできませんでした。それはちょうどエラーなしでスクリーンを点滅させ、私はログインプロンプトで立ち往生したままだった。ピクルスですべてうまく動作します。

重要なサイドノートこの問題はFlask-loginの統合に固有であり、

ASKSBADQUESTIONSのコードが実際に動作しないだけでバニラflaskセッションのシリアライズでは発生しませんが、これはデコードエラーがスローされます

import json 

from flask import Flask, session 
from flask.sessions import SecureCookieSession, SecureCookieSessionInterface 
from flask.ext.login import LoginManager 

class JSONSecureCookieSession(SecureCookieSession): 
    serialization_method = json 

class JSONSecureCookieSessionInterface(SecureCookieSessionInterface): 
    session_class = JSONSecureCookieSession 

app = Flask(__name__) 
app.secret_key = "I-like-cookies-and-some-secure-cookies" 
app.session_interface = JSONSecureCookieSessionInterface() 

#Initialize Login Manager 
login_manager = LoginManager() 
login_manager.setup_app(app) 

@app.route("/") 
def hello(): 
    k = "lalala" 

    v = session.get(k) 

    if v is None: 
     print "set" 
     v = session[k] = "FLAAASK abuses decorators in a bad way :)" 
    else: 
     print "get" 

    return "Hello {0}".format(v) 


if __name__ == "__main__": 
    app.run(debug=True) 

ここにスタックトレースがあります

Traceback (most recent call last): 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/flask/app.py", line 1362, in full_dispatch_request 
    response = self.process_response(response) 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/flask/app.py", line 1566, in process_response 
    self.save_session(ctx.session, response) 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/flask/app.py", line 804, in save_session 
    return self.session_interface.save_session(self, session, response) 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/flask/sessions.py", line 205, in save_session 
    secure=secure, domain=domain) 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/werkzeug/contrib/securecookie.py", line 329, in save_cookie 
    data = self.serialize(session_expires or expires) 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/werkzeug/contrib/securecookie.py", line 235, in serialize 
    self.quote(value) 
    File "/usr/local/pythonbrew/venvs/Python-2.7.3/flask-session-bug/lib/python2.7/site-packages/werkzeug/contrib/securecookie.py", line 192, in quote 
    value = cls.serialization_method.dumps(value) 
    File "/usr/local/pythonbrew/pythons/Python-2.7.3/lib/python2.7/json/__init__.py", line 231, in dumps 
    return _default_encoder.encode(obj) 
    File "/usr/local/pythonbrew/pythons/Python-2.7.3/lib/python2.7/json/encoder.py", line 195, in encode 
    return encode_basestring_ascii(o) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x97 in position 0: invalid start byte 
set 

答えて

3

flask_login.pyには_create_identifierと呼ばれる方法があります。この呼び出しの結果はmd5 digest()という結果になります。ドキュメントによると、これにはASCII以外の文字やnullバイトが含まれている可能性があります。 serialization_methodに渡すと、ユニコードのバイトをデコードできません。

このバグは、Flask 0.9とFlask-login 0.1.3の組み合わせにはっきりと存在し、この要点(https://gist.github.com/anonymous/3731115)をflask_login.pyファイルにパッチすることで修正できます。

あなたはだから私は実験を続け、より多くの情報 https://github.com/maxcountryman/flask-login/pull/31

1

私はすばやくFlaskアプリを書いていますあなたのバグを再現してください(app.py; python app.pyで起動):

import json 

from flask import Flask, session 
from flask.sessions import SecureCookieSession, SecureCookieSessionInterface 


class JSONSecureCookieSession(SecureCookieSession): 
    serialization_method = json 


class JSONSecureCookieSessionInterface(SecureCookieSessionInterface): 
    session_class = JSONSecureCookieSession 


app = Flask(__name__) 
app.secret_key = "I-like-cookies-and-some-secure-cookies" 
app.session_interface = JSONSecureCookieSessionInterface() 


@app.route("/") 
def hello(): 
    k = "lalala" 

    v = session.get(k) 

    if v is None: 
     print "set" 
     v = session[k] = "FLAAASK abuses decorators in a bad way :)" 
    else: 
     print "get" 

    return "Hello {0}".format(v) 


if __name__ == "__main__": 
    app.run(debug=True) 

すべてがスムーズに進みました。私はさらに、PickleベースからJSONベースに数回session_interfaceを変更して例外を取得しませんでした。おそらく、完全な例外のトレースバックを投稿し、バグを再現するために私の例にいくつかのコードを追加するべきでしょう。

+0

が必要な場合には、彼らのgithubのレポにこのバグを参照することができます。私はそこにあなたのコードを落とし、それは正常に動作します。私はあなたのコードを私の段階的なステップに統合しました。私が見つけたのは、私がFlask-Login拡張からログインマネージャを初期化すると、エラーが出始めた時です。 – nsfyn55

+0

したがって、上記の例を確認すると、Flaskログインモジュールの統合に固有のように見えます – nsfyn55