在用户提交的内容中呈现换行符(Python web app)

在用户提交的内容中呈现换行符(Python web app),python,html,jinja2,web.py,Python,Html,Jinja2,Web.py,我有一个web.py应用程序,它从文本区域获取输入并将其输入到数据库。我可以从数据库中获取信息并将其发布到页面上,但换行符不见了。如何在发回HTML时保留换行符?数据中确实包含\r\n,但在HTML中不会呈现为换行符。有什么想法吗?下面是一个小例子: (2, u'Title', u'content here...hey\r\nthis\r\nhas\r\nbreaks in it....?', datetime.datetime(2012, 7, 5, 21, 5, 14, 35451

我有一个web.py应用程序,它从文本区域获取输入并将其输入到数据库。我可以从数据库中获取信息并将其发布到页面上,但换行符不见了。如何在发回HTML时保留换行符?数据中确实包含
\r\n
,但在HTML中不会呈现为换行符。有什么想法吗?下面是一个小例子:

(2, u'Title', u'content here...hey\r\nthis\r\nhas\r\nbreaks in it....?', 
    datetime.datetime(2012, 7, 5, 21, 5, 14, 354516))
这是我从数据库返回的数据。我需要
\r\n
来表示一个

,如果有两个
,那就太棒了。任何指示都将不胜感激


还有这个图书馆吗?我听说过markdown和Markup,但我找不到如何从python字符串发布html数据的示例?

可以使用markdown之类的格式化语言,而不是使用非html的插入文本,因此不会显示为html(\r\n不是“p”标记等)

否则,您将需要手动替换/解析输入的文本(我认为这不是一个好主意,因为像markdown这样的语言就是为此而发明的)

有一些很好的python库可以将标记(存储在数据库中的数据)转换为html,如

它非常易于使用,请参见python标记链接中的示例:

>>> import markdown2
>>> markdown2.markdown("*boo!*")  # or use `html = markdown_path(PATH)`
u'<p><em>boo!</em></p>\n'

>>> markdowner = Markdown()
>>> markdowner.convert("*boo!*")
u'<p><em>boo!</em></p>\n'
>>> markdowner.convert("**boom!**")
u'<p><strong>boom!</strong></p>\n'
导入标记2 >>>markdown2.markdown(“*boo!*”)35;或使用`html=markdown_路径(path)` 嘘

\n' >>>markdowner=Markdown() >>>markdowner.convert(“*boo!*”) 嘘

\n' >>>markdowner.convert(“**boom!**”) 轰

\n' 这将强制您使用标记语法(或您使用的任何格式)输入内容。为了简化此操作,可以使用所见即所得编辑器为您创建标记(如Stackoverflow上的编辑器)。 我认为Stackoverflow使用了很多其他的降价所见即所得编辑器

大规模毁灭性武器的例子:

<html>
    <head>
        <title>WMD Example using jquery</title>
        <link rel="stylesheet" type="text/css" href="wmd.css"/>

        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript" src="jquery.wmd.min.js"></script>
    </head>
    <body>
        <h1>WMD Example using jquery</h1>
        <div>
            <textarea id="notes"/>
        </div>

        <script type="text/javascript">
            $().ready(function() {
               $("#notes").wmd(); 
            });
        </script>
    </body>
</html>

使用jquery的WMD示例
使用jquery的WMD示例
$().ready(函数()){
$(“#注释”).wmd();
});

在html中,新行不呈现为新行是一种预期行为。您需要插入

或将输入解析为文本段落,并用
包装这些段落。

我将两者混合使用:使用

表示单换行,使用
表示双换行。您可以在保存到数据库时或在取出数据库时执行此解析

编辑:我为您制作了以下图形。有几十种方法可以查看解析器。我个人认为它们是一种状态机。为了实现它,您应该以流式方式读取输入字符串,例如使用

Edit2:将描述“下推自动机”更改为“状态机”。下推自动机是正确的,但不精确,而且它与图形不匹配——我把两者混淆了

Edit3:这里有一些sudo代码,介绍如何在代码中实现状态机解析器,使用while循环、switch case和if语句进行状态转换

state = 'plainState'
streamer = get_stream_reader_from_input()
buffer = ''
while true {
  nextchar = streamer.readchar()
  if (nextchar == null) { //EOS
   print(buffer)
   exit
  }
  switch (state) {
    case('plainState') {
      if (nextchar == '\n') {
        state = 'singleBreakState' 
      }
      else if (nextchar == '\r') {
        state = 'CRState'
      }
      else {
        buffer += nextchar
      }
    }
    case('singleBreakState') {
      if (nextchar == '\n') {
        state = 'doubleBreakState' 
      }
      else if (nextchar == '\r') {
        state = 'CRState2'
      }
      else {
        state = 'plainState'
        buffer += '<br>' + nextchar
      }
    }
    //...
  }
}  
state='plainState'
拖缆=从\u输入()获取\u流\u读取器\u
缓冲区=“”
虽然是真的{
nextchar=streamer.readchar()
如果(nextchar==null){//EOS
打印(缓冲区)
出口
}
开关(状态){
案例(“平原州”){
如果(nextchar=='\n'){
状态='singleBreakState'
}
else if(nextchar=='\r'){
状态='CRState'
}
否则{
缓冲区+=nextchar
}
}
案例('singleBreakState'){
如果(nextchar=='\n'){
状态='doubleBreakState'
}
else if(nextchar=='\r'){
状态='CRState2'
}
否则{
状态='plainState'
缓冲区+='
'+nextchar } } //... } }
在提出解决方案之前,您需要对正在发生的事情有一些基本的了解。如果您不理解这个问题,“插入另一个库”方法要么根本不起作用(更好),要么很快就会适得其反(更糟)

@MichelMüller正确地指出,HTML源代码中的
\n
在浏览器中不会呈现为这样。有关此行为的更详细解释,请参见(警告,描述了HTML2.0)。现在,要在HTML中添加换行符,可以使用

;要添加新段落,

你可以做很多事情来实现这一点,但你要解决的问题是什么?此用户提交的内容是什么?谁提交的?需要考虑的两个方面是:

  • 格式设置。这是对公共网站的评论,还是网站工作人员准备的帖子,还是像Stack Overflow这样的网站上的UGC
  • 安全性。它是由陌生人发布的,还是由完全信任的用户发布的,还是介于两者之间的设置
  • 可能的解决办法: