Django拒绝POST请求中的urlencoded参数



使用邮差https://www.getpostman.com/发送url编码格式的POST请求。当不包含变量时传递,否则会遇到错误,例如:

  • 类型错误:int()参数必须是字符串或数字,而不是' list '

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

对于带有变量的django模型:

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

和关闭CRSF。可能产生以上错误的Post:

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')

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()

相关内容

  • 没有找到相关文章

最新更新