问题
I am running flask, pymongo and flask-login as a stack.
My flask app is running fine locally, but once I deploy it with uwsgi on nginx, I get a strange unicode error from flask_login extension.
In short:
TypeError: decoding Unicode is not supported
Traceback:
[pid: 21753|app: 0|req: 5/5] 84.207.253.34 () {38 vars in 600 bytes} [Thu Jun 13 16:51:08 2013] GET / => generated 0 bytes in 4 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)
Traceback (most recent call last):
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask/app.py", line 1473, in full_dispatch_request
rv = self.preprocess_request()
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask/app.py", line 1666, in preprocess_request
rv = func()
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask_login.py", line 311, in _load_user
deleted = self._session_protection()
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask_login.py", line 325, in _session_protection
ident = _create_identifier()
File "/myproject/myproject-env/local/lib/python2.7/site-packages/flask_login.py", line 133, in _create_identifier
request.headers.get("User-Agent")), 'utf8', errors='replace')
TypeError: decoding Unicode is not supported
Why is this not happening in dev environment? Hence it must be somehow related to uwsgi on nginx. Any suggestions? Many Thanks
回答1:
The problem won't be solved by downgrading flask alone, because even installing flask==0.9 would install the latest dependencies, which is the bad werkzeug==0.9
Hence you better install the following in this order:
pip install werkzeug==0.8.3
pip install flask==0.9
pip install Flask-Login==0.1.3
flask login, can then be the latest version 0.1.3. No harm done there. This stack works for me.
Hope this helps, until the emergency patch is out.
回答2:
I am having the very same problem on my dev environment, with Flask 0.10 and Flask-Login 0.1.3
looks like flask 0.10 now has unicode request headers so flask-login explodes when trying to encode an already encoded string...
Flask_login people are already working on it: https://github.com/maxcountryman/flask-login/issues/78
(EDIT) instant road to temporary happiness (as seen in github twin thread, thx Kofalt & Kave!)
pip uninstall flask ; pip uninstall werkzeug ; pip uninstall Flask-Login ; pip install werkzeug==0.8.3 ; pip install flask==0.9 ; pip install Flask-Login==0.1.3
回答3:
My fork which fixes this issue:
https://github.com/jgelens/flask-login/tree/0.1.4
Install using:
pip install https://github.com/jgelens/flask-login/archive/0f07b8fa783c40d09cb284d442a526f067bab28b.zip#egg=flask-login
回答4:
As per losu S., this looks to be a Flask 0.10 problem. Try to install previous version of Flask in your virtual environment using:
pip install Flask==0.9
来源:https://stackoverflow.com/questions/17092849/flask-login-typeerror-decoding-unicode-is-not-supported