带%的FlaskURL参数未正确处理

2024-10-05 12:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

伊迪蒂:我为不清楚道歉。 我将提供几个值。第一个是我使用我的前端应用程序调用的URL。第二个是调用urllib.unquote之前的值。第三个是调用urlib.unquote后的值。在

前端:

console.log('http://localhost:8080/v1/' + encodeURIComponent(name))

后端:

^{pr2}$

例如

http://localhost:8080/v1/https%3A%2F%2Fgoogle.com
* https:%2F%2Fgoogle.com
** https://google.com

例2。在

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",而不是{}。在

我目前正在使用python2.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%20bar"项。如果我试图删除它,它将删除"foo bar",一旦"foo bar"被删除,"foo%20bar"条目将永远不会被删除。在

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

我不太确定这是否是Flask/Werkzeug中的一个bug,但它导致我的应用程序无法工作。在

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


Tags: 函数httpscom应用程序localhosthttpurlflask
2条回答

不,Flask通常处理百分比编码。URL中的参数是百分比编码的,当WSGI环境被设置时,这些参数会被解码。当匹配时,烧瓶会把这个传给你的路线。在

如果您不需要再次解码参数值,请删除您的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显示为どうもありがとう)。在

如果您遇到了编码斜杠(^ {< CD5>},^ {CD6>})的问题,那么请参阅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: {urllib.parse.unquote(param)}\n",
        200,
        {'content-type': 'text/plain'}
    )

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

^{pr2}$

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

我认为问题是你不理解URL编码:) 它需要避免空格,因此浏览器会将它们转换为%20,然后通过烧瓶自动返回。 更多信息请阅读:https://www.w3schools.com/tags/ref_urlencode.asp

解决方案:使用foo%2520bar将编码的foo%20bar发送到服务器。在

相关问题 更多 >

    热门问题