- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 run
在 localhost: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/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!