8

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

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

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

    return pystache.render('{{kickstart}}', {'kickstart': ks_file})

这是我的vula包中的方法。它完全按照我需要的方式返回文件。但是在这和通过框架返回这个值之间再次发生了一些事情。

def getKickstartFile(self):

    response = urllib2.urlopen('https://my-satellite-server/core-kickstarter')
    ks_file = response.read()

    return ks_file

我开始使用 Bottle 作为框架,但我发现一个声明说它们不能返回多行字符串,所以从头开始。我搬到了 Flask,但目前 Flask 正在做同样的事情。我仍在学习 python,可能我做错了什么,但我需要任何帮助才能使其正常工作。我想输出一个多行字符串。我了解您使用

""" or '''

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

4

2 回答 2

12

Bottle 和 Flask 都可以很好地处理多行字符串。您的问题是您的数据被默认解释为text/html默认情况下,并且在 HTML 中,任何空格组合在显示时都会折叠成一个空格。为了确保您的数据完全按照您发送的方式返回,您需要将Content-Type标头设置为text/plain.

在烧瓶中:

# 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"""
于 2013-06-26T01:11:18.330 回答
3

肖恩的回答是正确的方法,但如果你只是想测试一些东西,你可以使用xmp标签:

@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!"""
于 2016-05-13T08:39:44.800 回答