如何从request.POST dict获取布尔值

时间:2014-01-22 10:56:12

标签: python django dictionary

我正在使用django 1.4并且我在request.POST.dict()中收到了包含Unicode格式的所有值的参数。如

{u'sam_status': u'true', u'address_type': u'false', u'is_deleted': u'false', u'title': u'true'}

但是这些值在从HTML页面的单选按钮呈现时应该是布尔值。

我想将此request.POST.dict()转换为一个简单的python dict,它将具有pythonic值,例如'true'/'false' ==> True/False.

注意:我不想申请循环,因为这可能会影响性能,因为这适用于大量数据。

3 个答案:

答案 0 :(得分:4)

阅读了评论,你正在做的方式(不使用Django表单,接受来自第三方网络应用程序的POST请求,并选择将输入序列化为u"true"u"false")没有选择,只能循环遍历POST字典键,并在python中手动将字符串转换为bool。如果这确实对性能产生了很大影响,那么可能需要重新考虑您的方法。

出于好奇,谁在设计你接受和序列化的表格?你甚至在做序列化还是他们?你在安全方面做了什么? “通用REST API模型表单提交”和“第三方Web应用程序”听起来像是灾难的秘诀。

修改:请勿使用eval()u"False"转换为False

>>> for key, value in request.POST.items():
...     if value == u'true':
...         a[key] = True
...     if value == u'false':
...         a[key] = False

答案 1 :(得分:1)

django如何知道这些问题是单选按钮输入? Django也是如此,因为其他表单输入答案都是以文本格式发送的。

将这些值转换为正确的数据类型的正确方法是通过Django表单。您可以为自己想要的答案创建一个表单,当它“干净”时,它将采用正确的格式。查看Django's own forms documentation

你应该有类似的东西:

   form = MyForm(request.POST)
   if form.is_valid():
         status = form.cleaned_data['sam_status']

请注意,后台的django表单会按照你所说的做,它将基本上通过数据并根据表单定义对它们进行规范化。但即使表单非常大,也不应该造成很大的性能问题。如果它非常慢,我建议你检查一下你遇到的性能瓶颈代码。

答案 2 :(得分:-1)

为什么不在发布时用JSON编码数据?像这样:

$.ajax({
  url:url,
  type:"POST",
  data:data,
  contentType:"application/json; charset=utf-8",
  dataType:"json",
  success: function(){
    ...
  }
});

然后,如果您在Django中解码响应主体,一切都会好的:

requestPost = json.loads(request.body.decode('utf-8'))