2013-03-22 22 views
6

Aşağıda oturum seri hale werkzeug en öneridirFlask SecureCookie yerine turşu

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

Oturum açmaya çalıştığımda bu olur.

json kodlayıcı kaynağını inceledim ve ensure_ascii=False'u ayarlamayı denedim ve bu, yukarıdaki hatayı geçmemi sağladı, ancak daha sonra uygulamada hiç oturum açamadım. Ekranı sadece bir hata olmadan yanıp sönecek ve giriş isteminde kaldım. Turşu ile her şey iyi çalışıyor.

önemli bir yan not, bu sorunun Flask-login entegrasyonu özeldir ve

ASKSBADQUESTIONS kodu gerçekten çalışır sadece vanilya flask seans serileştirme ile oluşmaz ancak bu kod çözme hatası atar

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) 

Ve burada hızla minimal Matara app yazdı

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 

cevap

3

flask_login.py adresinde _create_identifier adı verilen bir yöntem vardır. Bu çağrının sonucu bir md5 digest() sonucudur. Dokümanlara göre bu, ascii olmayan karakterler ve/veya boş baytlar içerebilir. serialization_method'a teslim edildiğinde, unicode baytlarını çözemez.

Bu hata kesinlikle Flask 0.9 ve Flask-login 0.1.3 kombinasyonunda mevcuttur ve bu giti (https://gist.github.com/anonymous/3731115) flask_login.py dosyasına yayarak düzeltilebilir veya en son geliştirme aşamasından yararlanabilirsiniz. Eğer https://github.com/maxcountryman/flask-login/pull/31

1

StackTrace olduğunu hatayı yeniden üret (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) 

Ancak her şey sorunsuz bir şekilde ilerledi. Hatta birkaç kez JSON tabanlı Pickle tabanlı session_interface değiştirdim ve istisna alamadım. Belki de tüm istisnai traceback'i yazmalı ve (belki) bir hatayı yeniden üretmek için örneğime bir kod eklemelisiniz.

+0

Yani deney devam Daha fazla bilgiye ihtiyacınız varsa

Onların github repo Bu hata başvurabilir. Kodunu oraya bıraktım ve iyi çalışıyor. Daha sonra kodunuzu adım adım mayın haline getirdim. Bulduğum şey, Flask-Login uzantısından giriş yöneticisini başlattığım dakika, hatayı almaya başladığım zamandır. – nsfyn55

+0

Yani, yukarıdaki örneğimi kontrol ederseniz, Flask-login modülünü entegre etmenin benzersiz olduğunu görüyorsunuz. – nsfyn55