Параметры URL фляги с% не обрабатываются должным образом - PullRequest
0 голосов
/ 19 марта 2019

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

Пример 2.

http://localhost:8080/v1/foo%2520bar
* foo%20bar
** foo bar

Пример 3.

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, но это приводит к тому, что мое приложение не работает.

У вас есть предложения по устранению этой проблемы?Спасибо!

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Нет, 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: {urllib.parse.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, который неправильно обрабатывает кавычки в путях.

0 голосов
/ 19 марта 2019

Я думаю, что проблема в том, что вы не понимаете кодировку URL :) Требуется избегать пробелов, поэтому они переводятся браузером в% 20 и автоматически возвращаются флягой.Прочитайте это для получения дополнительной информации: https://www.w3schools.com/tags/ref_urlencode.asp

Решение: отправьте кодированный foo%20bar на сервер с foo%2520bar.

...