使用Python Flask或其他框架输出多行字符串

使用Python Flask或其他框架输出多行字符串,python,flask,web2py,redhat,bottle,Python,Flask,Web2py,Redhat,Bottle,我试图在服务器设置中使用Redhat kickstart文件之前,在python中对其进行修改。我的应用程序使用python从我的Redhat卫星服务器卷曲原始kickstart文件,然后我对kickstart文件中的某些值进行字符串替换。当我在python中卷曲文件时,它会以多行字符串的形式返回,这是我需要的,以便redhat kickstart正确解释文件。但是,当我通过这些框架之一(web2py、瓶子、烧瓶)返回字符串变量时,发生了一些事情,它没有以多行字符串的形式返回,我需要它保留原始文

我试图在服务器设置中使用Redhat kickstart文件之前,在python中对其进行修改。我的应用程序使用python从我的Redhat卫星服务器卷曲原始kickstart文件,然后我对kickstart文件中的某些值进行字符串替换。当我在python中卷曲文件时,它会以多行字符串的形式返回,这是我需要的,以便redhat kickstart正确解释文件。但是,当我通过这些框架之一(web2py、瓶子、烧瓶)返回字符串变量时,发生了一些事情,它没有以多行字符串的形式返回,我需要它保留原始文件的确切格式,除了我更改的区域。我不想把我的kickstart文件放在模板中,因为我是通过satellite来管理它们的,如果我从satellite中卷曲文件,那么它会接受任何修改,而不需要一直进入模板。然后在一个模板或其他东西中,我要么返回不带模板的字符串,要么在一个模板文件中,我只将1个变量作为整个kickstart文件传递给模板

@route('/kickstart/<name>')
def kickstart(name):

    ks = vula.kickstarter.kickstart.Kickstarter()
    ks_file = ks.getKickstartFile()

    return pystache.render('{{kickstart}}', {'kickstart': ks_file})
我开始使用瓶子作为框架,但我发现一条语句说它们不能返回多行字符串,所以请擦掉它。我转到了Flask,但目前Flask也在做同样的事情。我仍在学习python,可能我做错了什么,但我需要任何可能的帮助来让它正常工作。我想输出一个多行字符串。我知道你用的是

""" or '''

对于多行字符串,但即使这样做并通过框架发送,它仍将作为一个连续行打印到屏幕上。我做错了什么?作为最后手段,如果我不能输出多行字符串,我将被迫将kickstart文件放入模板。

瓶子和烧瓶都可以处理多行字符串。您的问题是,默认情况下,您的数据被解释为
text/html
,而在html中,任何空白组合在显示时都会折叠到单个空间中。为了确保数据完全按照您发送的方式返回,您需要将
内容类型
标题设置为
文本/普通

在烧瓶中:

# If you want *all* your responses to be text/plain
# then this is what you want
@app.after_request
def treat_as_plain_text(response):
    response.headers["content-type"] = "text/plain"
    return response

# If you want only *this* route to respond
# with Content-Type=text/plain
@app.route("/plain-text")
def a_plain_text_route():
    response = make_response(getKickstartFile())
    response.headers["content-type"] = "text/plain"
    return response
瓶装:

@route("/plain-text")
def plain_text():
    response.content_type = "text/plain"
    return """This
              multi-line string
              will show up
              just fine"""

Sean的答案是正确的,但是如果您只是想测试一些东西,您可以使用
xmp
标记:

@app.route("/"):
def hello():
    return """<xmp>
              Hello,
              Multiline!
              </xmp>"""

如何检查最终输出?在控制台中还是通过带有浏览器的web?如果通过web当然看不到新行,因为它应该是

,而不是
\n
,但在您的情况下,当然不需要
,您只是看不到新行,但对于控制台,它应该可以……确保响应的mime类型是您所期望的。默认情况下,Flask将以HTML的形式发送响应,在您的情况下,听起来您需要纯文本。是的,你们是对的。我没有考虑内容类型。我最近刚开始学习python并使用其中的一些框架,所以有时我找不到合适的地方来寻找答案。谢谢你的帮助。
@app.route("/"):
def hello():
    return """<xmp>
              Hello,
              Multiline!
              </xmp>"""
from functools import wraps

def multiline(fn):
    @wraps(fn)
    def _fn(*args, **kwargs):
        return "<xmp>" + fn(*args, **kwargs) + "</xmp>"
    return _fn
    @app.route("/"):
    @multiline
    def hello():
    return """Hello,
              Multiline!"""