You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python处理的表单中避免文本字段的HTML转义?

解决表单提交后HTML被转义的问题

这个问题很常见——毕竟大部分Python Web框架为了安全,默认都会自动转义输出的HTML内容,防止XSS攻击。如果你确定要输出原始HTML(重点提醒:仅限内容完全可信的场景,比如你自己输入的内容,绝对不要对普通用户的未验证输入这么做!),可以根据你使用的工具/框架来操作:

1. Flask 或基于 Werkzeug 的项目

  • 方法一:在视图层用Markup类包装内容
    从Flask导入Markup,把用户提交的HTML内容包裹后再传递给模板或直接返回:
    from flask import Flask, Markup, request
    
    app = Flask(__name__)
    
    @app.route('/submit', methods=['POST'])
    def submit():
        user_html = request.form.get('html_content')
        # 包裹后输出的就是原始HTML
        return Markup(user_html)
    
  • 方法二:在Jinja2模板中使用safe过滤器
    如果是在模板里渲染内容,直接给变量加上|safe标记:
    <div>{{ user_submitted_html|safe }}</div>
    

2. Django 项目

  • 方法一:模板层用safe过滤器
    和Flask类似,在Django模板中直接使用过滤器:
    <div>{{ html_content|safe }}</div>
    
  • 方法二:视图层用mark_safe函数
    从Django的安全模块导入mark_safe,标记内容为安全的原始HTML:
    from django.shortcuts import render
    from django.utils.safestring import mark_safe
    
    def submit(request):
        if request.method == 'POST':
            user_html = request.POST.get('html_content')
            safe_html = mark_safe(user_html)
            return render(request, 'result.html', {'html_content': safe_html})
    

3. 原生Python(无Web框架)

如果是直接处理HTTP请求(比如CGI脚本),只要确保输出正确的Content-Type头,然后直接打印原始HTML即可:

# 设置HTTP响应头
print("Content-Type: text/html")
print()  # 空行分隔头和内容
# 直接输出原始HTML
print(request.form.get('html_content'))  # 这里假设你已经获取到表单数据

关键安全提示

再次强调:如果内容来自不可信的用户(比如网站的普通注册用户),绝对不要跳过转义。未经过滤的HTML可能包含恶意脚本(XSS攻击),会窃取其他用户的信息或者破坏网站功能。如果必须处理用户提交的HTML,一定要先使用HTML清理库(比如bleach)过滤掉危险标签和属性,再考虑输出。

内容的提问来源于stack exchange,提问作者4thSpace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:18:45