Flaskr url_for с параметрами, не работающими при вызове из javascript в python

Я нахожусь в середине создания веб-приложения.

В javascript я делаю ajax-вызов своему скрипту python, обрабатываю и отправляю результат обратно в качестве ответа. /process/ — это путь к скрипту Python для обработки значений, которые отправляются как json, а именно value1 и value2. Я отправляю ответ как значение настройки json в ключе «результат».

В блоке успеха ajax значение хранится в name_value, и его следует передать в качестве параметра методу маршрутизации Python.

Javascript:

$.ajax({
        type: "GET",
        url: "/process/",
        contentType: "application/json; charset=utf-8",
        data: { "value1" : value1,
                "value2" : value2
               },
        success: function(data) {
            var name = data.result;
            console.log(name);
            window.location.href = "{{url_for('/process2', name=name)}}"
        }
    });

Скрипт Python:

app.route("/process2/<name>")
def process2(name):
    print name
    render_template("user.html", name=name);

В этом случае я не получаю значение параметра, если параметр передается в url_for. Если я жестко запрограммирую параметр, я смогу получить значение параметра в скрипте python, например,

window.location.href = "{{url_for('/process2', name='helloworld')}}"

Любая помощь приветствуется. Заранее спасибо.


person bhoo    schedule 24.11.2014    source источник
comment
Этот JS отображается в шаблоне или в статическом файле? Единственный способ, которым url_for будет преобразован Jinja в реальную строку URL, — это если она является частью вашего шаблона.   -  person Celeo    schedule 25.11.2014
comment
Да .. он отображается только в шаблоне. Папка шаблона содержит мой html-файл, в котором у меня есть javascript.   -  person bhoo    schedule 25.11.2014


Ответы (1)


Из опыта я узнал, что Jinja не может использовать переменные Javascript, например:

window.location.href = "{{ url_for('/process2', name=name) }}"

Если я ошибаюсь, кто-нибудь, пожалуйста, поправьте меня, и вы станете моим лучшим другом в сообществе SO.

РЕДАКТИРОВАТЬ:

Как упомянул Джейсон Хайне, вы можете добиться того, чего хотите, передав метод url_for в качестве результата в json:

Питон:

from flask import jsonify, url_for

@app.route("/process", methods=['GET', 'POST'])
def process():    
    name = 'bubba'  # code to get the name
    return jsonify({
        'result': url_for('process2', name=name),
        'name': name
     })

@app.route("/process2/<string:name>")
def process2(name):
    print name
    render_template("user.html", name=name);

Javascript:

$.ajax({
    type: "GET",
    url: "/process",
    contentType: "application/json; charset=utf-8",
    data: { "value1" : value1,
            "value2" : value2
           },
    success: function(data) {
        var route = data.result;
        var name = data.name;
        console.log(route, name);

        window.location.href = route;
    }
});

Вы также можете ознакомиться с документацией AJAX с jQuery, если у вас есть дополнительные вопросы. .

person Wondercricket    schedule 24.11.2014
comment
Или вы можете просто сделать url_for в процессе маршрута и вернуть его в вызов ajax, извлечь эти данные, а затем передать их в location.href. - person CodeLikeBeaker; 25.11.2014
comment
Ах! Почему я не подумал об этом? Спасибо за информацию - person Wondercricket; 25.11.2014