【问题标题】:Django rejecting urlencoded parameters in POST request?Django拒绝POST请求中的urlencoded参数?
【发布时间】:2015-10-22 18:59:26
【问题描述】:

使用 Postman https://www.getpostman.com/ 以 url 编码格式发送 POST 请求。它们在没有包含变量时通过,否则会遇到错误,例如:

  • 对于整数参数:类型错误:int() 参数必须是字符串或数字,而不是“列表”

  • 对于十进制参数:ValueError:从列表或元组创建十进制时元组大小无效。列表或元组应恰好包含三个元素。

对于带有变量的 django 模型:

grams = models.IntegerField(default=0)
amount_payable = models.DecimalField(max_digits = 5, decimal_places = 2)

并且关闭 CRSF。可能产生上述错误的帖子是:

POST /mypath/ HTTP/1.1
Host: 127.0.0.1:8000
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cache-Control: no-cache
Postman-Token: 36eac051-d7e9-b106-effa-aa1fd557a42f

amount_payable=25.22&grams=450

然后在 Django 的调试页面中找到:

<django.db.models.manager.Manager object at 0x10c6d2110>  
args   ()  
name   'create'  
kwargs   {u'amount_payable': [u'25.22'], u'grams': [u'450']}

看起来格式都很好,Django 解析有问题吗?已尝试使用其他模型和变量类型。 POST的格式/内容有问题吗?

这样查看代码:

def create_transaction(request):
    this_transaction = Transaction.objects.create(**request.POST)
    return HttpResponse('AOK')

【问题讨论】:

  • ` {u'amount_payable': [u'25.22'], u'grams': [u'450']}` - 您的变量被包装在列表中,这会导致错误。您可以发布处理 POST 请求并填充模型的视图代码吗?
  • def create_transaction(request): this_transaction = Transaction.objects.create(**request.POST) return HttpResponse('AOK') 已在原帖底部添加更清晰的位置。

标签: django postman


【解决方案1】:

request.POST 不是普通的字典,它实际上是一个QueryDict 对象。您需要将其转换为传统的字典,然后才能使用它:

Transaction.objects.create(**request.POST.dict())

我必须说,以上内容我不会投入生产 - 没有检查字典的内容 - 任何恶意/垃圾都可以用来创建对象。

您应该使用表单来验证输入,然后创建对象,如下所示:

class TransactionForm(forms.ModelForm):
   class Meta:
       model = Transaction

user_input = TransactionForm(request.POST())
if user_input.is_valid():
   user_input.save()

【讨论】:

  • 非常感谢。 Django 非常强大,但它的简洁性可能让人难以抗拒。
猜你喜欢
  • 2017-12-11
  • 2021-09-08
  • 2017-01-14
  • 2015-11-06
  • 1970-01-01
  • 2020-04-15
  • 2016-10-17
  • 2014-08-10
  • 1970-01-01
相关资源
最近更新 更多