为啥 Flask 将这个变量作为 unicode 而不是作为数组接收?

Posted

技术标签:

【中文标题】为啥 Flask 将这个变量作为 unicode 而不是作为数组接收?【英文标题】:Why does Flask is receiving this variable as unicode but not as array?为什么 Flask 将这个变量作为 unicode 而不是作为数组接收? 【发布时间】:2019-10-20 07:33:06 【问题描述】:

我尝试使用 Jquery 通过 Post 方法发送一个数组。

function post_to_url(path, params, method) 
    method = method || "post"; // Set method to post by default, if not specified.

    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) 
        if(params.hasOwnProperty(key)) 
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         
    

    document.body.appendChild(form);
    form.submit();


var url = "url_for('page')";
post_to_url(url,'data':arrayObj, "post");

直到这里,当我使用console.log($.type(arrayObj)) 时,它返回给我一个数组。

@mod.route('/page',methods=["POST","GET"])
def page():
 if request.method=="POST":
  import pdb; pdb.set_trace()
  d = request.form['data']
  return render_template('testing/page.html',data=d)
 return render_template('testing/page.html')

使用 PDB,type(d) 变量返回一个 unicode。为什么?

【问题讨论】:

【参考方案1】:

params 有一个键。 for循环执行一次,这一行:

hiddenField.setAttribute("value", params[key]);

…正在将隐藏字段值设置为序列化为字符串的数组。

如果您知道所有的键都是数组对象,那么只需遍历值并插入多个输入元素:

for (let key in params) 
    if (params.hasOwnProperty(key)) 
        let values = params[key];
        for (let value of values) 
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", value);
            form.appendChild(hiddenField);
        
    

如果您不知道所有键都是数组,则可以更改后端代码以逗号分隔传入值。请注意,对于任何字面上包含 , 的值,这将中断。

@mod.route('/page',methods=["POST","GET"])
def page():
 if request.method=="POST":
  d = request.form['data']
  d_array = d.split(',')
  return render_template('testing/page.html',data=d_array)
 return render_template('testing/page.html')

【讨论】:

Printing document.body.appendChild(form); 它正在创建一个隐藏的输入并将所有数组值存储在 value 字段中,例如 <input type="hidden" name="data" value="1,234,567,adsa,sadasf,23432,32432"> 没错。如果您想在 Flask 端创建一个数组,则必须使用 str.split 之类的东西解析单数输入,或者您的前端脚本需要为数组中的每个 n 项创建 n 隐藏输入。 你能告诉我吗?我正在尝试,但没有成功! 更新为在前端显示循环或在后端拆分。 奇怪,它只是返回第一个位置,当我打印 form.appendChild 时,只返回一个值

以上是关于为啥 Flask 将这个变量作为 unicode 而不是作为数组接收?的主要内容,如果未能解决你的问题,请参考以下文章

烧瓶登录:TypeError:不支持解码Unicode

为啥使用 Nginx 运行 Flask 需要 WSGI 包装器?

为啥使用 STL std::vector 作为 __block 变量会导致内存损坏?

[mysql-connector-python在将表作为参数传递时,在表名周围添加单引号。表名来自Flask会话变量

将 JavaScript 变量传递给 Flask url_for

11_自定义flask_jinja2模板过滤器