【发布时间】:2019-03-19 17:04:16
【问题描述】:
EDIT2:我为缺乏明确性表示歉意。
我将提供几个值。第一个是我使用前端应用程序调用的 URL。第二个是调用urllib.unquote之前的值。第三个是调用urlib.unquote后的值。
前端:
console.log('http://localhost:8080/v1/' + encodeURIComponent(name))
后端:
def f(param=''):
print('*', param)
param = urllib.unquote(param)
print('**', param)
例如
http://localhost:8080/v1/https%3A%2F%2Fgoogle.com
* https:%2F%2Fgoogle.com
** https://google.com
Ex2.
http://localhost:8080/v1/foo%2520bar
* foo%20bar
** foo bar
Ex3.
http://localhost:8080/v1/foo%20bar
* foo bar
** foo bar
感谢您耐心等待并帮助我解决此问题。我很抱歉在我的原始帖子中不清楚。
编辑:简而言之,如果我调用/v1/%2520,param 在函数末尾等于" ",而不是"%20",在函数开头它等于"%20" 而不是"%2520".
我目前正在使用 Python 2.7 开发 Flask 应用程序。
我正在尝试创建一个可以处理 URL 参数的函数。
@app.route('/v1/<param>', methods=['DELETE'])
def f(param=''):
param = urllib.unquote(param)
在我的前端应用程序中,我通过编码 param 来调用此函数。但是,如果我将"foo bar" 和"foo%20bar" 传递给函数,param 被解析为相同的值——"foo bar",而真正的"foo bar" 应该是"foo bar" 和"foo%20bar" 应该是@987654342 @。
由于这个错误,我无法删除 "foo%20bar" 条目。如果我尝试删除它,它会删除"foo bar",一旦"foo bar"被删除,"foo%20bar"条目将永远不会被删除。
我相信这是因为"%20" 不等于"%2520",即使那是参数。当我在调用urllib.unquote(param) 之前打印此值时,它已经等于"%20"。然后,当我调用urllib.unquote(param) 时,值将更改为" "。
我不确定这是否是 Flask/Werkzeug 中的错误,但它会导致我的应用程序无法运行。
您对解决此问题有什么建议吗?谢谢!
【问题讨论】:
-
不,
foo%20bar是foo bar。甚至浏览器 URL 栏中的foo bar实际上也是作为foo%20bar发送到服务器的。如果你真的想要 URL 解码后的foo%20bar,那么发送foo%2520bar。 -
对不起。我一定是不清楚。在我使用
urllib.unquote修改值之前,"foo%2520bar"等于"foo%20bar"。所以如果我调用/v1/foo%2520bar,参数值等于"foo bar"而不是"foo%20bar"@MartijnPieters -
那你为什么还要使用
urllib.unquote()呢? -
@MartijnPieters 我会将 URL 传递给参数。
标签: python url flask encoding werkzeug