2013-03-22 7 views
6

Nachfolgend finden Empfehlung des werkzeug für die Sitzungs Serialisierung:Flask SecureCookie ersetzt Gurke mit json Ergebnisse in Codierungsfehler

The default implementation uses Pickle as this is the only module that used to be available in the standard library when this module was created. If you have simplejson available it’s strongly recommended to create a subclass and replace the serialization method:

Wenn ich beide haben im Anschluss an diese den Kolben Implementierung unter:

https://gist.github.com/runfalk/2501926

oder alternativ

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

Dies passiert, wenn ich versuche, mich anzumelden.

Ich habe in die Json-Encoder-Quelle eingetaucht und versucht, ensure_ascii=False einzustellen, und dies hat mich über den Fehler oben hinaus, aber dann konnte ich mich überhaupt nicht in die Anwendung einloggen. Es würde nur den Bildschirm ohne Fehler blinken und ich blieb bei der Login-Eingabeaufforderung stecken. Mit Gurke funktioniert alles gut.

Eine wichtige Randnotiz dieses Problem auf die Integration der Flask-login einzigartig ist und nur mit der Vanille flask Sitzung Serialisierung

ASKSBADQUESTIONS des Code funktioniert in der Tat nicht auftritt, aber dies führt den Dekodierungsfehler

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) 

Und hier ist die stacktrace

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 

Antwort

3

Es gibt eine Methode in flask_login.py genannt _create_identifier. Das Ergebnis dieses Aufrufs ist ein md5 digest() Ergebnis. Laut den Dokumenten kann dies nicht-ASCII-Zeichen und/oder Nullbytes enthalten. Wenn es an die serialization_method übergeben wird, kann es die Unicode-Bytes nicht decodieren.

Dieser Fehler existiert definitiv in der Kombination von Flask 0.9 und Flask-login 0.1.3 und kann durch Affepatching dieses Gist (https://gist.github.com/anonymous/3731115) in der Flask_login.py-Datei behoben werden, oder Sie können die neueste aus der Entwicklung ziehen.

können Sie zu diesem Fehler auf ihre GitHub Repo verweisen, wenn Sie weitere Informationen benötigen https://github.com/maxcountryman/flask-login/pull/31

1

ich minimal Flask App schnell geschrieben reproduzieren Sie Ihren Fehler (gespeichert in app.py; aufgerufen mit 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) 

Aber alles lief glatt. Ich habe sogar session_interface von Pickle-basierten zu JSON-basierten einige Male geändert, und keine Ausnahme erhalten. Vielleicht sollten Sie einen vollständigen Ausnahme-Traceback posten und (vielleicht) etwas Code zu meinem Beispiel hinzufügen, um einen Fehler zu reproduzieren.

+0

Also habe ich das Experimentieren fortgesetzt. Ich habe deinen Code dort eingegeben und es funktioniert gut. Dann habe ich Ihren Code Schritt für Schritt in meinen integriert. Was ich gefunden habe, ist die Minute, in der ich den Login-Manager von der Flask-Login-Erweiterung initialisiere, wenn ich den Fehler bekomme. – nsfyn55

+0

Also, wenn Sie mein Beispiel oben überprüfen, sehen Sie, dass es eindeutig zu sein scheint, das Flask-Login-Modul zu integrieren – nsfyn55