Как обрабатывать несколько параметров, содержащих косую черту? - PullRequest
2 голосов
/ 06 апреля 2019

У меня есть приложение Flask, в которое мне нужно передать несколько параметров, содержащих косую черту.Например, у меня есть parameter1 = "Clothes/Bottoms" и parameter2 = "Pants/Jeans".Я попытался сделать это следующим образом:

В моем HTML / JS:

par1 = encodeURIComponent(parameter1);
par2 = encodeURIComponent(parameter2);
console.log("Par1 = ",par1," par2 = ",par2);
$.ajax({
     type:'post',
     url:'/get_data'+'/'+par1+'/'+par2,
     ....
});

и в моем app.py:

 @app.route('/get_data/<path:par1>/<path:par2>/',methods=['GET','POST'])
 def get_data(par1, par2):
     print("In get_data with par1 ",par1," and par2 ",par2)
     ....

Я могу видеть из печати Javascriptвычитает, что оба параметра выглядят нормально после кодирования, но вывод на Python:

 In get_data with par1 Clothes and par2 Bottoms/Pants/Jeans

Так что он каким-то образом ошибочно принимает косую черту в par1 s "Clothes/Bottoms" для части URL и сдвигов"Bottoms" в par2.

Есть ли лучший способ обработки нескольких параметров с косой чертой, чем просто добавление path:?

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Для понимания маршрутизации в колбе (werkzeug).Отложите на секунду кодирование, которое вы использовали в JavaScript.

Шаблон регулярного выражения, используемый конвертером path werkzeug, равен [^/].*?.Это позволяет любое количество / в пути URL.Это означает, что только part1 get_data/<path:par1> может принимать как get_data/Clothes/Bottoms, так и get_data/Clothes/Bottoms/Pants/Jeans.

. Вы используете два преобразователя path в part1 и par2, что плохо, так как одна part1 может принять весь слеш.

Теперь другой вопрос.почему даже после кодирования URL-адрес не работает должным образом .

Flask использует WSGI-сервер Werkzeug по умолчанию.И библиотека WSGI освобождает URI перед использованием его для маршрутизации.то есть get_data/Clothes%2FBottoms преобразуется в get_data/Clothes/Bottoms, когда речь идет о маршрутизации.в вашем случае маршрутизатор получает get_data/Clothes/Bottoms/Pants/Jeans, здесь он принимает «Одежда» как часть 1 и отдых как часть 2.

См. вопрос с колбой относительно этого.

Решение

Двойной побег в JavaScript может быть здесь.Преобразователь path также можно заменить на string.

par1 = encodeURIComponent(encodeURIComponent(parameter1));
par2 = encodeURIComponent(encodeURIComponent(parameter2));

$.ajax({
     type:'post',
     url:'http://localhost:8000/get_data'+'/'+par1+'/'+par2+'/'});

И декодировать в колбу, чтобы вернуть свои строки

from urllib import unquote_plus
@app.route('/get_data/<string:par1>/<string:par2>/',methods=['GET','POST'])
def get_data(par1, par2):
    print unquote_plus(par1),  unquote_plus(par1)
1 голос
/ 06 апреля 2019

При /get_data/<path:par1>/<path:par2>/ у Flask нет возможности «узнать», какой слэш является разделителем, когда он получает запрос, такой как /get_data/Clothes/Bottoms/Pants/Jeans/.

Если число слешей в par1 фиксировано,вы можете получить путь в виде одного параметра, а затем разделить его на два:

@app.route('/get_data/<path:pars>/')
def get_data(pars):
     par1 = '/'.join(pars.split("/",2)[:2]) #par1 is everything up until the 2nd slash
     par2 = pars.split("/",2)[2:][0] #par2 is everything after the second slash

В противном случае вы можете просто заменить косую черту разделителя другим символом, например:

@app.route('/get_data/<path:par1>-<path:par2>/')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...