Python SqlAlchemy不使用utf8字符集,即使已指定

Python SqlAlchemy不使用utf8字符集,即使已指定,python,mysql,unicode,flask,flask-sqlalchemy,Python,Mysql,Unicode,Flask,Flask Sqlalchemy,我正在使用Flask with Flask SqlAlchemy with MySQL,我的连接字符串上确实有charset-utf8参数 我也在使用反射,我的模型如下所示: class Value(db.Model): __bind_key__ = 'values' __tablename__ = 'values' 我还尝试了将#-*-编码:utf8-*-放入我的文件中的技巧,但我仍然得到这些堆栈跟踪: Traceback (most recent call last):

我正在使用Flask with Flask SqlAlchemy with MySQL,我的连接字符串上确实有
charset-utf8
参数

我也在使用反射,我的模型如下所示:

class Value(db.Model):
    __bind_key__ = 'values'
    __tablename__ = 'values'
我还尝试了将
#-*-编码:utf8-*-
放入我的文件中的技巧,但我仍然得到这些堆栈跟踪:

Traceback (most recent call last):
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask_debugtoolbar/__init__.py", line 125, in dispatch_request
    return view_func(**req.view_args)
  File "/usr/lib/python2.7/cProfile.py", line 149, in runcall
    return func(*args, **kw)
  File "/home/numkem/src/sd/application/views/player.py", line 54, in player_show
    return render_template('player/show.html', **locals())
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask/templating.py", line 128, in render_template
    context, ctx.app)
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/flask/templating.py", line 110, in _render
    rv = template.render(context)
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/jinja2/environment.py", line 969, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/numkem/src/sd/venv/lib/python2.7/site-packages/jinja2/environment.py", line 742, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/numkem/src/sd/application/templates/player/show.html", line 1, in top-level template code
    {% extends "base.html" %}
  File "/home/numkem/src/sd/application/templates/base.html", line 62, in top-level template code
    {% block body %}{% endblock %}
  File "/home/numkem/src/sd/application/templates/player/show.html", line 27, in block "body"
    <td>{{ field.values }}</td>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 16: ordinal not in range(128)
回溯(最近一次呼叫最后一次):
文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask/app.py”,第1836行,在调用中__
返回self.wsgi_应用程序(环境,启动响应)
wsgi_应用程序中的文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask/app.py”,第1820行
响应=self.make\u响应(self.handle\u异常(e))
文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask/app.py”,第1403行,在句柄中
重放(exc_类型、exc_值、tb)
文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask/app.py”,wsgi_应用程序第1817行
response=self.full\u dispatch\u request()
文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask/app.py”,第1477行,完整发送请求
rv=自身处理用户异常(e)
文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask/app.py”,第1381行,在handle\u user\u exception中
重放(exc_类型、exc_值、tb)
文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask/app.py”,第1475行,完整发送请求
rv=自我分派请求()
文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask_debugtoolbar/_init__.py”,第125行,在调度请求中
返回视图函数(**请求视图参数)
文件“/usr/lib/python2.7/cProfile.py”,第149行,在runcall中
返回函数(*参数,**kw)
文件“/home/numkem/src/sd/application/views/player.py”,第54行,在player\u show中
返回渲染模板('player/show.html',**locals())
render_模板中的文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask/templating.py”,第128行
上下文(ctx.app)
文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/flask/templating.py”,第110行,在_render中
rv=template.render(上下文)
文件“/home/numkem/src/sd/venv/lib/python2.7/site packages/jinja2/environment.py”,第969行,在渲染中
返回self.environment.handle\u异常(exc\u info,True)
文件“/home/numkem/src/sd/venv/lib/python2.7/site-packages/jinja2/environment.py”,第742行,在句柄中
重放(exc_类型、exc_值、tb)
顶级模板代码中的文件“/home/numkem/src/sd/application/templates/player/show.html”,第1行
{%extends“base.html”%}
顶级模板代码中的文件“/home/numkem/src/sd/application/templates/base.html”,第62行
{%block body%}{%endblock%}
文件“/home/numkem/src/sd/application/templates/player/show.html”,第27行,在块“body”中
{{field.values}}
UnicodeEncodeError:“ascii”编解码器无法对位置16中的字符u'\xe1'进行编码:序号不在范围内(128)
为什么在连接时忽略字符集?它不应该由连接字符串设置吗?也许这不是使用反射时可能/支持的东西


谢谢

此错误意味着在模板中传递非unicode字符串作为上下文,因为Jinja2只支持unicode


您应该阅读有关编码的内容。

此错误意味着您在模板中传递非unicode字符串作为上下文,因为Jinja2只支持unicode


您应该阅读这篇关于编码的文章。

事实证明,问题并不是来自SqlAlchemy,而是来自Jinja2本身,因为它没有看到我想在整个应用程序中使用utf8编码。表示如果未指定任何内容,则默认编码设置为ascii

这显示了我问题的解决方案

修复方法是将此添加到您的第一个代码中:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

我对python不是100%熟悉,但我认为这可能与使用WSGI应用程序而不是标准脚本有关,因此
-*-编码:utf8-*-
技巧不起作用。

事实证明问题并不是来自SqlAlchemy,而是来自Jinja2本身,因为它没有看到我想要使用utf8编码完成应用程序。表示如果未指定任何内容,则默认编码设置为ascii

这显示了我问题的解决方案

修复方法是将此添加到您的第一个代码中:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

我对python不是100%熟悉,但我认为这可能与使用WSGI应用程序而不是标准脚本有关,因此
#-*-编码:utf8-*-
技巧不起作用。

数据来自SqlAlchemy,我能够看到它在模板外正确显示。我开始认为它可能与Jinja本身有关,而不是与SqlAlchemy有关。数据来自SqlAlchemy,我能够看到它正确地出现在模板之外。开始认为这可能与金甲本身有关,而不是炼金术