当前位置: 首页 > 面试题库 >

在flask中禁用自动转义

高胜
2023-03-14
问题内容

我想向用户显示一些文本。我要发送的字符串变量包含多个换行符,并且我不想\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模块,但是它们也不起作用。

正确的方法是什么?


问题答案:

您可以采用两种合理的方法。

解决方案1

当您将不安全的输入和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)

解决方案2

另一个选择是将复杂度推入模板,从而使视图更简单。只需分成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