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