Tôi có một ứng dụng web sử dụng Flask, SQLAlchemy và WTForms, cùng với các phần mở rộng Flask cần thiết để làm cho nó hoạt động. MySQL đang sử dụng utf8_bin
cho tất cả các bảng và cột.Flask, SQLAlchemy và Jinja2 - UnicodeDecodeError
tôi chèn một số chữ Hán và phpMyAdmin hiển thị chúng một cách chính xác nhưng bất cứ khi nào tôi cố gắng để mở một trang tôi nhận được ngoại lệ sau đây:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
Tôi hiểu rằng tôi nên decode('utf8')
các lĩnh vực Tôi muốn hiển thị nhưng shouldn 'Điều này được xử lý bởi SQLAlchemy cho tôi?
Cách duy nhất tôi quản lý để làm cho công việc này là bằng cách duyệt qua danh sách các kết quả và làm điều gì đó tương tự như:
object.property = object.property.decode('utf8')
Nhưng rõ ràng điều này không cần phải được thực hiện bằng tay. Tôi đang thiếu gì?
Cập nhật: lập bản đồ SQLAlchemy
class Thread(db.Model):
__tablename__ = 'Thread'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.Unicode(255), nullable=False)
body = db.Column(db.Text, nullable=True)
date_created = db.Column(db.DateTime, nullable=False, default=datetime.now())
created_by = db.Column(db.Integer, ForeignKey(User.id))
user = relationship(User, backref='threads')
display_hash = db.Column(db.Unicode(255), nullable=False, unique=True)
display_name = db.Column(db.Unicode(255), nullable=True)
nsfw = db.Column(db.Boolean, nullable=False, default=False)
last_updated = db.Column(db.DateTime, nullable=False)
def __init__(self, title=None, body=None, category_id=None, display_name=None):
self.title = title
self.body = body
self.category_id = category_id
self.display_name = display_name
self.display_hash = custom_uuid()
self.last_updated = self.date_created
def __repr__(self):
return u'<Thread %r>' % (self.title)
def url_title(self):
""" Generates an ASCII-only slug. """
result = []
for word in _punct_re.split(self.title.lower()):
result.extend(unidecode(word).split())
return unicode(u'-'.join(result))
Cập nhật: stack trace
`127.0.0.1 - - [06/Oct/2013 02:37:15] "GET /index HTTP/1.1" 500 -
Traceback (most recent call last):
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/homedirectory/Projects/Assorted/Fruit Show/app/views.py", line 90, in index
return render_template('index.html', threads=threads, pagination=pagination)
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/templating.py", line 128, in render_template
context, ctx.app)
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/flask/templating.py", line 110, in _render
rv = template.render(context)
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/jinja2/environment.py", line 969, in render
return self.environment.handle_exception(exc_info, True)
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/jinja2/environment.py", line 742, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/homedirectory/Projects/Assorted/Fruit Show/app/templates/index.html", line 1, in top-level template code
{% extends 'base.html' %}
File "/Users/homedirectory/Projects/Assorted/Fruit Show/app/templates/base.html", line 50, in top-level template code
{% block content %}
File "/Users/homedirectory/Projects/Assorted/Fruit Show/app/templates/index.html", line 14, in block "content"
<a href="{{ url_for('new_thread') }}/{{ thread.display_hash|safe }}/{{ thread.url_title()|safe }}">{{ thread.title|safe }}</a>
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/jinja2/filters.py", line 747, in do_mark_safe
return Markup(value)
File "/Users/homedirectory/.virtualenvs/fruitshow/lib/python2.7/site-packages/markupsafe/__init__.py", line 72, in __new__
return text_type.__new__(cls, base)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)`
Cập nhật: URL cho repo dự án:
https://github.com/ruipacheco/fruitshow
Vui lòng cập nhật câu hỏi của bạn với các mô hình SQLAlchemy mà bạn đang gặp sự cố. –
Cảm ơn bạn đã cập nhật. Bạn cũng có thể cập nhật câu hỏi của mình và cung cấp một đoạn mã ngắn mà bạn có thể sử dụng để sao chép lỗi, bao gồm cả dấu vết ngăn xếp đầy đủ mà mã cung cấp. –
Ngoài ra, MySQL [có thể mặc định kết nối máy khách để sử dụng latin1 ngay cả khi các bảng và cột đang sử dụng unicode] (http://docs.sqlalchemy.org/en/rel_0_8/dialects/mysql.html#unicode). –