烧瓶登录:TypeError:不支持解码Unicode

Posted

技术标签:

【中文标题】烧瓶登录:TypeError:不支持解码Unicode【英文标题】:Flask Login: TypeError: decoding Unicode is not supported 【发布时间】:2013-06-10 04:18:58 【问题描述】:

我将 flask、pymongo 和 flask-login 作为堆栈运行。

我的烧瓶应用程序在本地运行良好,但是在 nginx 上使用 uwsgi 部署它后,我从 flask_login 扩展中收到一个奇怪的 unicode 错误。

简而言之:

TypeError: decoding Unicode is not supported

追溯:

[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

为什么这在开发环境中没有发生?因此它必须与 nginx 上的 uwsgi 有某种关系。有什么建议?非常感谢

【问题讨论】:

【参考方案1】:

我在开发环境中遇到了同样的问题,使用 Flask 0.10 和 Flask-Login 0.1.3

看起来flask 0.10现在有unicode请求标头,所以flask-login在尝试编码已经编码的字符串时会爆炸......

Flask_login 的人已经在研究它了: https://github.com/maxcountryman/flask-login/issues/78

(编辑) 通往暂时幸福的捷径(见 github 双线程,感谢 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

【讨论】:

感谢您的链接。我现在已经删除了整个虚拟环境并创建了一个新堆栈。但我仍然得到同样的错误:Babel==0.9.6 Flask==0.9 Flask-Assets==0.8 Flask-Babel==0.8 Flask-Bcrypt==0.5.2 Flask-Login==0.1.3 Flask-WTF==0.8.3 Jinja2==2.7 MarkupSafe==0.18 WTForms==1.0.4 Werkzeug==0.9 argparse==1.2.1 closure==20121212 cssmin==0.1.4 isodate==0.4.9 jsonschema==2.0.0 py-bcrypt==0.3 pymongo==2.5.2 python-dateutil==1.5 pytz==2013b rauth==0.5.4 requests==1.1.0 speaklater==1.3 webassets==0.8 wsgiref==0.1.2 Kave 也一样,也许 werkzeug 也必须降级?但是,已请求对烧瓶登录进行紧急修复。 在发布之前使用 Flask 0.9,或者自己修补 Flask-Login。【参考方案2】:

我的叉子解决了这个问题:

https://github.com/jgelens/flask-login/tree/0.1.4

安装使用:

pip install https://github.com/jgelens/flask-login/archive/0f07b8fa783c40d09cb284d442a526f067bab28b.zip#egg=flask-login

【讨论】:

【参考方案3】:

根据 losu S.,这看起来是 Flask 0.10 的问题。尝试在您的虚拟环境中安装以前版本的 Flask:

pip install Flask==0.9

【讨论】:

pip install Flask==0.9 不解决问题因为它会下载werkzeug==0.9 所以你必须使用pip install flask==0.9 werkzeug==0.8.3【参考方案4】:

仅通过降级flask无法解决问题,因为即使安装flask==0.9也会安装最新的依赖项,这是不好的werkzeug==0.9 因此,您最好按此顺序安装以下内容:

pip install werkzeug==0.8.3
pip install flask==0.9
pip install Flask-Login==0.1.3

flask登录,然后可以是最新的0.1.3版本。那里没有造成任何伤害。 这个堆栈对我有用。

希望这会有所帮助,直到紧急补丁发布为止。

【讨论】:

在我看来,这是最好的做法。 Re: 紧急补丁:考虑到 Flask-Login 的维护者有said not to expect one,我不希望它出来。从外观上看,Flask-Login 在清理分支之前将不支持 Flask v0.10。哪一个,AFAIC,很好:只是不要使用 Flask 0.10 :) 另请注意,这是一个上游错误,reported here。 Flask-Login 已经更新,但当然不能解决上游的问题。您现在可能更喜欢使用0.2.x release series。 不幸的是,这对我不起作用,尽管我怀疑是 Flask-OauthLib 有问题。

以上是关于烧瓶登录:TypeError:不支持解码Unicode的主要内容,如果未能解决你的问题,请参考以下文章

调用 Flash restful 服务时在烧瓶上显示错误。 TypeError:“响应”类型的对象不是 JSON 可序列化的

将 JSON 从烧瓶传递到模板并解码 html 实体 [重复]

如何登录烧瓶?

如何使用 Jinja2 模板在烧瓶中解码 &#39 [重复]

Flask-登录 | TypeError:需要支持缓冲区 API 的对象

烧瓶不和谐 api 错误 “消息”:“401:未经授权”,“代码”:0