2016-11-09 2 views
0

Я пытаюсь преобразовать приложение Python Flask с 2,7 до 3,5. У меня простая система CMS, использующая SQLAlchemy, где мои страницы отображаются на странице Index с заголовком и контентом (которые усекаются). Вот где моя проблема.Python 3.5 TypeError: необходим байтовый объект, а не 'str' с использованием фильтра 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 %} 
+0

Так что 'page.title' - объект байтов. Фильтр 'truncate' работает только для объектов' str'. –

ответ

0

ошибка вызвана page.title быть bytes объектом. Вы не можете использовать bytes.rsplit() с значением str (что и делает truncate). Фильтр truncate поддерживает только str Юникод.

Вы должны убедиться, что pages.title является объектом unicode str. Сделайте это либо путем декодирования в шаблоне, либо путем определения поля title как строки Юникода, а не байтов в вашей модели и базе данных.

Декодирование в шаблоне может быть сделано с:

{{ page.title.decode('utf8')|truncate(150) }} 

при условии, что ваши данные на самом деле UTF-8 закодирован.

Это не было проблемой в Python 2, так как там, где это необходимо, символы молчания преобразуются в строки unicode (и при условии, что они могут быть декодированы).

Смежные вопросы