将POST请求中的非字符串参数发送到Tornado服务器

时间:2012-09-06 23:08:48

标签: python post tornado

在Tornado的RequestHandler的post方法中,self.get_argument(arg, None)获取请求中包含的arg值。

我看到的所有示例都返回一个字符串作为值,这让我想知道我们是否可以在POST请求中发送除字符串之外的数据。

我感兴趣的特定用例:我在页面上有一个包含多个字段的表单,我希望在POST请求中将其字段的一部分组合在一个参数中服务器,像

packed = self.get_argument('packed_arg', None)
arg1 = packed['arg1']
arg2 = packed['arg2']
...

而其他字段仍然是个别参数。到目前为止,我认为这个打包参数的数据结构类似于dict(也许是JSON?),这是否可行?

1 个答案:

答案 0 :(得分:1)

JSON非常适合您的目的。

在客户端做这样的事情:

var data = {'packed_arg':get_form_args(); } 

函数get_form_args()是抽象的。你可以任何方式实现它。默认情况下,Javascript对象是JSON。 因此,在客户端,您必须从表单字段创建字典。 这样想:

var data = {};
var names_to_pack = ['packed1', 'packed2']
$(form).find('input, select').each(function (i, x) {
    var name = $(x).attr('name')
    if(names_to_pack.indexOf(name) != -1) { 
        if(!data.packed) {
            data.packed = {};  
        }
        data['packed'][name] = $(x).val(); 
    } else { 
        data[name] = $(x).val(); 
    }
});
$.post('/', data); 

然后在服务器端:

raw_packed = self.get_argument('packed_arg', None)
packed = {}
if raw_packed: 
    packed = tornado.escape.json_decode(raw_packed)
arg1 = packed.get('arg1')
arg2 = packed.get('arg2')

您还可以访问self.request.arguments中的所有POST参数。