Python 3.5 TypeError:需要类似字节的对象,而不是';str';使用截断滤波器
我正在尝试将我的Python Flask应用程序从2.7转换为3.5。我有一个使用SQLAlchemy的简单CMS系统,其中我的页面显示在带有标题和内容(被截断)的索引页面上。这就是我的问题所在 它以列表的形式返回我的页面,以字符串的形式返回我的内容。我试图对“页面”进行编码,但这会返回另一个错误,因为列表对象上不允许这样做 错误:Python 3.5 TypeError:需要类似字节的对象,而不是';str';使用截断滤波器,python,python-3.x,flask,jinja2,Python,Python 3.x,Flask,Jinja2,我正在尝试将我的Python Flask应用程序从2.7转换为3.5。我有一个使用SQLAlchemy的简单CMS系统,其中我的页面显示在带有标题和内容(被截断)的索引页面上。这就是我的问题所在 它以列表的形式返回我的页面,以字符串的形式返回我的内容。我试图对“页面”进行编码,但这会返回另一个错误,因为列表对象上不允许这样做 错误: File "C:\Python35\lib\site-packages\jinja2\filters.py", line 481, in do_truncate
File "C:\Python35\lib\site-packages\jinja2\filters.py", line 481, in do_truncate
result = s[:length - len(end)].rsplit(' ', 1)[0]
TypeError: a bytes-like object is required, not 'str'
路线:
@app.route("/")
def main():
pages = db.session.query(Pages).all()
return render_template('index.html', title='Dashboard', pages=pages)
index.html页面
{% for page in pages %}
<div>
<a href="{{ url_for('view_page', page_id=page.id) }}"><h3>{{ page.title|truncate(150) }}</h3></a>
<p>{{ page.content|truncate(450)|striptags }}</p>
</div>
{% endfor %}
{%页中的页%}
{{page.content | truncate(450)| striptags}}
{%endfor%}
错误是由页面引起的。title
是字节
对象。不能将bytes.rsplit()
与str
值一起使用(这就是truncate
的作用)。truncate
过滤器仅支持str
Unicode值
您必须确保页面。title
是一个unicodestr
对象。通过在模板中解码,或者通过在模型和数据库中将title
字段定义为Unicode字符串而不是字节来实现
模板中的解码可通过以下方式完成:
{{ page.title.decode('utf8')|truncate(150) }}
如果您的数据实际上是UTF-8编码的
这在Python2中不是一个问题,因为ByTestRing会根据需要(并且可以解码)以静默方式转换为
unicode
字符串。因此page.title
是一个字节对象。truncate
过滤器仅适用于str
对象。