Flask redirect为何将外部URL的&转义为&?如何解决?
Flask重定向后URL中的&被转义为&的原因及解决方法
问题原因
Flask的redirect()函数在返回302重定向响应时,除了设置Location响应头(这里的URL是正确编码的,包含&),还会自动生成一个备用的HTML页面——这个页面是给不自动遵循重定向规则的客户端准备的,其中的跳转链接文本会经过HTML转义处理,所以原始的&会被转换成HTML实体&。
你直接打印link时看到的是未经过转义的原始字符串,而curl默认不自动跟随重定向,所以会显示这个备用HTML页面里的转义后链接。
解决方法
方法1:让客户端自动跟随重定向
正常浏览器会自动读取Location头并跳转,不会看到这个备用HTML页面。如果用curl测试,只需添加-L参数让它跟随重定向:
curl -L https://my.domain.com/endpoint
这样就能直接访问到目标URL,看不到转义后的链接了。
方法2:禁用Flask生成的备用HTML页面
如果你不需要这个备用HTML页面,可以直接返回自定义的Response对象,只设置Location头和状态码,这样就不会生成带转义链接的HTML内容:
from flask import Flask, Response from urllib.parse import urlencode app = Flask(__name__) @app.route('/endpoint') def redirect_to_external(): parameters = {'foo': 'bar', 'baz': 'qux'} link = 'https://some.domain.com?%s' % urlencode(parameters) # 直接返回Response,仅设置重定向头和状态码 return Response(status=302, headers={'Location': link})
这种方式下,响应中只有状态码和Location头,没有HTML内容,自然不会出现&被转义的问题。
内容的提问来源于stack exchange,提问作者gbrl
相关产品推荐
相关产品推荐

