Dan*_*iel 5 python url encoding werkzeug flask
EDIT2:对于缺乏清晰度,我深表歉意。我将提供几个值。第一个是我使用前端应用程序调用的 URL。第二个是调用之前的值urllib.unquote。第三个是调用后的值urlib.unquote。
前端:
console.log('http://localhost:8080/v1/' + encodeURIComponent(name))
Run Code Online (Sandbox Code Playgroud)
后端:
def f(param=''):
print('*', param)
param = urllib.unquote(param)
print('**', param)
Run Code Online (Sandbox Code Playgroud)
前任。
http://localhost:8080/v1/https%3A%2F%2Fgoogle.com
* https:%2F%2Fgoogle.com
** https://google.com
Run Code Online (Sandbox Code Playgroud)
例 2.
http://localhost:8080/v1/foo%2520bar
* foo%20bar
** foo bar
Run Code Online (Sandbox Code Playgroud)
例 3.
http://localhost:8080/v1/foo%20bar
* foo bar
** foo bar
Run Code Online (Sandbox Code Playgroud)
感谢您对此的耐心和帮助。对于我原来的帖子中不清楚的地方,我深表歉意。
编辑:简而言之,如果我调用/v1/%2520, param 等于" "在函数末尾,而不是"%20",在函数开头它等于"%20"而不是"%2520"。
我目前正在使用 Python 2.7 开发 Flask 应用程序。
我正在尝试创建一个可以处理 URL 参数的函数。
@app.route('/v1/<param>', methods=['DELETE'])
def f(param=''):
param = urllib.unquote(param)
Run Code Online (Sandbox Code Playgroud)
在我的前端应用程序中,我通过编码param. 但是,如果我将"foo bar"and传递"foo%20bar"给函数,则 theparam会解析为相同的值 -- "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 中的错误,但它导致我的应用程序无法工作。
您对解决这个问题有什么建议吗?谢谢!
Mar*_*ers 11
不,Flask 通常会完全正确地处理百分比编码。URL 中的参数采用百分比编码,并且在设置 WSGI 环境时为您进行解码。然后 Flask 在匹配时将其传递给您的路线。
\n您不需要再次解码参数值,删除您的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显示为\xe3\x81\xa9\xe3\x81\x86\xe3\x82\x82\xe3\x81\x82\xe3\x82\x8a\xe3\x81\x8c\xe3\x81\xa8\xe3\x81\x86)。
如果您遇到编码斜杠 ( /, %2F) 的问题,请参阅问题 #900,需要考虑 Apache 指令(和其他 WSGI 服务器)的边缘情况。您需要使用一个<path:param>组件来匹配它们,因为默认string参数类型不会匹配斜杠。
如果我使用以下测试脚本,名为routetest.py:
from flask import Flask\ntry:\n from urllib.parse import unquote # PY3\nexcept ImportError:\n from urllib import unquote # PY2\n\napp = Flask(__name__)\n\n@app.route(\'/v1/<path:param>\') # NOTE: <path:param> is required to match /\ndef f(param=\'\'):\n return (\n f"param: {param}\\ndecoded param: {unquote(param)}\\n",\n 200,\n {\'content-type\': \'text/plain\'}\n )\nRun Code Online (Sandbox Code Playgroud)\n使用FLASK_APP=routetest flask run在 上启动此脚本localhost:5000,那么我无法重现您的问题:
$ curl http://localhost:5000/v1/https%3A%2F%2Fgoogle.com\nparam: https://google.com\ndecoded param: https://google.com\n$ curl http://localhost:5000/v1/foo%2520bar\nparam: foo%20bar\ndecoded param: foo bar\n$ curl http://localhost:5000/v1/foo%20bar\nparam: foo bar\ndecoded param: foo bar\nRun Code Online (Sandbox Code Playgroud)\n这只能意味着您的 WSGI 服务器错误地处理了路径中的引用。
\n