All whitespace, including newlines, is turned into a single space in HTML.
Your options, from best to worst:
- Put
white-space: pre-wrap;
on the containing element. This tells HTML to show all whitespace exactly as it appears in the source, including newlines. (You could also use a<pre>
tag, but that will also disable word-wrapping, which you probably don’t want.) - Treat the plain text as Markdown and throw a Markdown processor at it—one of the things Markdown does is wrap paragraphs in
<p>
. - In Python-land, do
.replace('\n', '<br>')
. But this leaves you vulnerable to XSS because there might be other HTML-like junk in the string, and fixing that is a bit of a pain.