gpt4 book ai didi

python - 带有 % 的 Flask URL 参数未正确处理

转载 作者:行者123 更新时间:2023-12-02 14:51:42 25 4
gpt4 key购买 nike

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

例 3.

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" 应该是 "foo%20bar"

由于这个错误,我无法删除 "foo%20bar" 条目。如果我尝试删除它,它会删除 "foo bar",一旦 "foo bar" 被删除,"foo%20bar"条目永远不会被删除。

我相信这是因为 "%20" 不等于 "%2520",即使那是参数。当我在调用 urllib.unquote(param) 之前打印此值时,它已经等于 "%20"。然后,当我调用 urllib.unquote(param) 时,值更改为 ""

我不太确定这是否是 Flask/Werkzeug 中的错误,但它导致我的应用程序无法运行。

您对解决这个问题有什么建议吗?谢谢!

最佳答案

不,Flask 通常处理百分比编码完全正确。 URL 中的参数是百分比编码的,并且在设置 WSGI 环境时会为您解码这些参数。 Flask 然后在匹配时将其传递给您的路线。

不需要再次解码参数值,删除您的urllib.unquote()打电话。

您的浏览器实际上会将 URL 中的空格编码为 %20对你来说,即使地址栏会显示一个空格。位置栏对百分比编码的组件进行解码,以便可以读取国际字符(例如,%E3%81%A9%E3%81%86%E3%82%82%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86 显示为 どうもありがとう)。

如果您遇到编码斜杠( /%2F )的问题,请参阅 issue #900 ,需要考虑 Apache 指令(和其他 WSGI 服务器)的边缘情况。您需要使用 <path:param>组件匹配那些,因为默认 string参数类型将不匹配斜杠。

如果我使用下面的测试脚本,命名为routetest.py :

from flask import Flask
try:
from urllib.parse import unquote # PY3
except ImportError:
from urllib import unquote # PY2

app = Flask(__name__)

@app.route('/v1/<path:param>') # NOTE: <path:param> is required to match /
def f(param=''):
return (
f"param: {param}\ndecoded param: {unquote(param)}\n",
200,
{'content-type': 'text/plain'}
)

使用FLASK_APP=routetest flask runlocalhost:5000 上启动此脚本,那么我无法重现您的问题:

$ curl http://localhost:5000/v1/https%3A%2F%2Fgoogle.com
param: https://google.com
decoded param: https://google.com
$ curl http://localhost:5000/v1/foo%2520bar
param: foo%20bar
decoded param: foo bar
$ curl http://localhost:5000/v1/foo%20bar
param: foo bar
decoded param: foo bar

这只能意味着您有一个错误处理路径中引用的 WSGI 服务器。

关于python - 带有 % 的 Flask URL 参数未正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55246431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com