2016-11-09 13 views
0

Ich versuche, meine Python Flask App von 2.7 auf 3.5 zu konvertieren. Ich habe ein einfaches CMS-System mit SQLAlchemy, wo meine Seiten auf der Indexseite mit Titel und Inhalt angezeigt werden (die abgeschnitten sind). Dort ist mein Problem.Python 3.5 TypeError: ein Byte-ähnliches Objekt wird benötigt, nicht 'str' mit Truncate Filter

Es gibt meine Seiten als Liste und meine Inhalte als Zeichenfolge zurück. Ich habe versucht, die "Seiten" zu codieren, aber das gibt einen weiteren Fehler zurück, weil das für ein Listenobjekt nicht erlaubt ist.

Fehler:

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' 

Die Route:

@app.route("/") 
def main(): 
    pages = db.session.query(Pages).all() 
    return render_template('index.html', title='Dashboard', pages=pages) 

index.html Seite

{% 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

Also 'page.title' ist ein Byte-Objekt. Der 'truncate' Filter funktioniert nur für' str' Objekte. –

Antwort

0

Der Fehler von page.title ist ein bytes Objekt verursacht wird. Sie können bytes.rsplit() nicht mit einem str Wert verwenden (was truncate tut). Der truncate-Filter unterstützt nur str Unicode-Werte.

Sie müssen sicherstellen, pages.title ist ein Unicode str Objekt stattdessen. Tun Sie dies, indem Sie entweder in der Vorlage dekodieren oder indem Sie das title-Feld als Unicode-Zeichenfolge definieren und nicht als Byte in Ihrem Modell und Ihrer Datenbank.

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

versehen Ihre Daten tatsächlich UTF-8 codiert:

Dekodierung in der Vorlage kann mit erfolgen.

Dies war kein Problem in Python 2, da dort Bytestrings bei Bedarf in unicode Zeichenfolgen konvertiert werden (und sofern sie dekodiert werden können).

Verwandte Themen