我想向用户显示一些文本。我要发送的字符串变量包含多个换行符,并且我不想\n
显示。所以我做了:
footext = """f
o
o"""
#footext == "f\no\no"
@app.route("/someurl")
def foo():
return render_template("bar.html", text = footext.replace("\n", "<br />"))
bar.html:
<html>
{{ text }}
</html>
但是启用了自动转义,我看到的是f<br />o<br />o
。同样,我的方法也不安全,我希望除<br />
文本外的每个标记都被转义。我看了flask.Markup模块,但是它们也不起作用。
正确的方法是什么?
您可以采用两种合理的方法。
当您将不安全的输入和HTML组合到一个变量flask.Markup
中时,实际上是一种方便的方法。基本思想是在换行符上分割文本,确保HTML转义了您不信任的每一行,然后将它们重新粘合在一起,再加<br />
上您确实信任的标记。
这是完整的应用程序,以证明这一点。它使用与bar.html
您的问题相同的模板。请注意,我在其中添加了一些不安全的HTML,footext
以说明为什么关闭自动转义
不是 解决您的问题的安全方法。
import flask
app = flask.Flask(__name__)
footext = """f
o
<script>alert('oops')</script>
o"""
@app.route("/foo")
def foo():
text = ""
for line in footext.split('\n'):
text += flask.Markup.escape(line) + flask.Markup('<br />')
return flask.render_template("bar.html", text=text)
if __name__ == "__main__":
app.run(debug=True)
另一个选择是将复杂度推入模板,从而使视图更简单。只需分成footext
几行,然后您就可以在模板中对其进行循环,自动转义将确保此安全。
简单的视图:
@app.route("/foo")
def foo():
return flask.render_template("bar.html", text=footext.split('\n'))
模板bar.html变为:
<html>
{%- for line in text -%}
{{ line }}
{%- if not loop.last -%}
<br />
{%- endif -%}
{%- endfor -%}
</html>
我个人更喜欢解决方案2,因为它会将渲染关注点(线条由<br />
标签分隔)放在它们所属的模板中。如果您将来想要更改此设置,例如在项目符号列表中显示行,则只需更改模板,而不是代码。
问题内容: 我有一些缓存问题。我正在运行一个很小的Web应用程序,该应用程序读取一帧并将其保存到磁盘,然后在浏览器窗口中显示。 我知道,这可能不是最好的解决方案,但是每次我使用相同的名称保存此读取帧时,任何浏览器都会对其进行缓存。 我试图使用html meta-tags-没有成功: 另外,我已经尝试过这一步骤(特定于烧瓶): 这是我尝试修改标头的方式: Google Chrome和Safari仍然
问题内容: 如何设置初始化我的Flask应用程序以将Flask-SQLAlchemy设置为自动提交模式,除非我明确地不使用事务? 会话“ 开始通信后即开始数据库事务 ”。这是否会影响Postgres的难度比MySQL? 通过Instagram, 自动提交模式;在这种模式下,Psycopg2不会对任何查询发出BEGIN / COMMIT;相反,每个查询都在其自己的单语句事务中运行。这对于不需要事务语
我正在编写一个绘图应用程序,我不希望绘图视图旋转。同时,我希望其他控件根据设备的方向很好地旋转。在iOS7中,我通过以下方式解决了这个问题: 但在iOS 8上,即使调用了该函数并正确设置了变换,也不会阻止视图旋转。 我尝试过创建一个视图控制器,它可以简单地防止视图的旋转并将其视图添加到视图层次结构中,但它不会响应用户输入。 有什么想法吗? 谢谢
问题内容: 我最近一直在使用sqlite4java库。我想我已经弄清楚了。唯一令我困扰的是,我不知道如何使用该库关闭自动提交。谁能帮忙吗?一个代码示例将不胜感激。 在此先感谢Boro 问题答案: Jefromi和king_nak是正确的-您只需要发出开始和结束事务的SQL语句即可。
Android将WIFI详细信息保存到WifiConfiguration类中。当WIFI为ON和SSID时,Pass-key详细信息与WIFI网络匹配,然后Android自动连接特定的WIFI网络。如何禁用该自动连接功能?问这个问题的目的是,我有两个配置的网络(已经保存),我想在按钮单击事件上连接WIFI,但android的自动连接功能与WIFI本身连接。
我已将ViewPager2与Tablayout连接。其他引用ViewPager的帖子提供了覆盖setCurrentItem(position,false)的方法,其中false禁用平滑滚动。但是,TabLayoutMediator调用OntabSelect(tablayout.tab tab),后者调用viewPager.setCurrentItem(postion,true)。如果TabLayo