如何使用Flask将JavaScript数组传递给Python脚本 [使用Flask示例]

9
我正在尝试让我特定情况下的flask/jquery/ajax例子 能够运行,但每次都失败了。我知道这种问题已经被问过好几次了,但答案对我没有帮助(是的,我是新手)。
该示例将一个字符串从javascript传递到python。我想传递一个数组。网上建议这是可能的。下面是我的代码: HTML/Flask模板:
{% extends "layout.html" %}
{% block title %}Test{% endblock %}
{% block content %}
    <div>
      <h1>Flask Jquery Test</h1>
      <div>
        <input type="button" value="Transfer" id="button" />
      </div>
      <div>
        Wordlist<br />
        <select multiple="multiple" id="wordlist" size="5">
            <option>Volvo</option>
            <option>Audi</option>
            <option>BMW</option>
            <option>Mercedes</option>
            <option>Toyota</option>
        </select>
        <span id="result"></span>
      </div>
    </div>
{% endblock %}

JS脚本:

$(document).ready(function() {
    $("#button").bind('click', function(){
        //Get all words from list
        var list = [];
        $("#wordlist option").each(function(){
            list.push($(this).val());
        });
        //var list = $( "#wordlist option" ).val();
        console.log(list);
        $.getJSON($SCRIPT_ROOT + '/_array2python', {
            wordlist: list.toString()
        }, function(data){
            console.log(data.result)
            $( "#result" ).text(data.result);
        });
        return false;
    });
});

Python:

@app.route('/')
def start_page():
    return render_template('index.html')

@app.route('/_array2python')
def array2python():
    wordlist = request.args.get('wordlist', [])
    return jsonify(result=wordlist)

@app.errorhandler(404)
def page_not_found(e):
    """Return a custom 404 error."""
    return 'Sorry, nothing at this URL.', 404

现在,当将字符串(例如var list = $(“#wordlist option”).val();)传递到list变量中时,此代码可以正常工作。但是,当尝试使用数组时,它只会传递备份值(即[])。

这是否意味着我只能将字符串传递给Python?我如何最好地将JavaScript数组传递给Python?

感谢大家的帮助!

P.S.也许重要的是提到。我正在使用Google应用引擎托管此代码。

=================================================================================

供您参考,这些是我尝试遵循但未能帮助我的SO网站:

将JavaScript数组传递给Flask(非常出色且详细的答案,但无法使其正常工作)

从JavaScript传递数据到Flask

从HTML / JS返回数据到Python


我已经为同一个问题做出了答案,链接在这里:https://dev59.com/7oDaa4cB1Zd3GeqP_RHm#40951200 - joseph
1个回答

15

这里有一种将JS数组传递给Python的另一种方法:

JS端:

$.getJSON($SCRIPT_ROOT + '/_array2python', {
        wordlist: JSON.stringify(list)
    }, function(data){
        console.log(data.result)
        $( "#result" ).text(data.result);
    });

Python 方面:

import json

@app.route('/_array2python')
def array2python():
    wordlist = json.loads(request.args.get('wordlist'))
    # do some stuff
    return jsonify(result=wordlist)

据我所知,字符串是从客户端传递数组到服务器的唯一方式。


3
$.post(endpoint, {wordlist: list}, null, 'json').then(successHandler)也可以使用,但需要从request.form.getlist('wordlist')中提取。另一方面,不需要使用json.loads - Sean Vieira
太神奇了,就像添加json.loads可以给代码带来很大的不同。我已经怀疑只有字符串可以传递,但这个版本使得这一点少了一些痛苦;)。谢谢@Thomas N。 - Nebelhom
我认为Sean的答案最干净。不需要手动序列化/反序列化。让Flask处理这项工作。 - jds
2
Sean的答案对我有用,使用request.form.getlist('wordlist[]') - Erwan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接