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)
Ex.
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
, параметр равен " "
в конце функции вместо "%20"
, в начале функции он равен "%20"
, а не "%2520"
.
В настоящее время я работаю над приложением Flask, используя Python 2.7.
Я пытаюсь создать функцию, которая может обрабатывать параметры 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, но из-за нее мое приложение не работает.
Есть ли у вас какие-либо предложения по устранению этой проблемы? Спасибо!
foo%20bar
являетсяfoo bar
. Дажеfoo bar
в адресной строке браузера фактически отправляется на сервер какfoo%20bar
. Если вы действительно хотелиfoo%20bar
после декодирования URL, отправьтеfoo%2520bar
. - person Martijn Pieters   schedule 19.03.2019"foo%2520bar"
равно"foo%20bar"
ДО того, как я изменю значение с помощьюurllib.unquote
. Поэтому, если я вызову/v1/foo%2520bar
, значение параметра будет равно"foo bar"
вместо"foo%20bar"
@MartijnPieters - person Daniel   schedule 19.03.2019urllib.unquote()
? - person Martijn Pieters   schedule 19.03.2019