无法在Django中测试POST

时间:2017-08-10 17:24:13

标签: json django python-3.x testing post

使用Python3,Django和Django Rest框架。 以前我有一个测试用例正在对端点进行POST。 有效载荷是一本字典:

mock_data = {some data here}

为了通过我正在执行的POST发送数据:

mock_data = base64.b64encode(json.dumps(mock_data).encode('utf-8'))

执行POST时:

response = self.client.post(
    '/some/path/here/', {
        ...,
        'params': mock_data.decode('utf-8'),
    },
)

在接收端,我在做validate()方法:

params = data['params']
try:
    params_str = base64.b64decode(params).decode('utf-8')
    app_data = json.loads(params_str)
except (UnicodeDecodeError, ValueError):
    app_data = None

这一切都很好,但现在我需要使用一些hmac验证,而我传递的json不再是dict - 它的排序每次都会改变,所以hmac.new(秘密,有效载荷,算法)会与众不同。 我试图使用字符串:

payload = """{data in json format}"""

但是当我在做的时候:

str_payload = payload.encode('utf-8')
b64_payload = base64.b64encode(str_payload)

我无法发布它,并收到错误:

raise TypeError(repr(o) + " is not JSON serializable")
TypeError: b'ewog...Cn0=' is not JSON serializable

即使我像以前一样b64_payload.decode('utf-8'),仍然会遇到类似的错误:

raise TypeError(repr(o) + " is not JSON serializable")
TypeError: b'\xa2\x19...\xff' is not JSON serializable

终端中的一些python:

>>> d = {'email': 'user@mail.com'} # regular dictionary
>>> d
{'email': 'user@mail.com'}
>>> dn = base64.b64encode(json.dumps(d).encode('utf-8'))
>>> dn
b'eyJlbWFpbCI6ICJ1c2VyQG1haWwuY29tIn0='
>>> s = """{"email": "user@mail.com"}""" # string
>>> s
'{"email": "user@mail.com"}'
>>> sn = base64.b64encode(json.dumps(s).encode('utf-8'))
>>> sn
b'IntcImVtYWlsXCI6IFwidXNlckBtYWlsLmNvbVwifSI=' # different!
>>> sn = base64.b64encode(s.encode('utf-8'))
>>> sn
b'eyJlbWFpbCI6ICJ1c2VyQG1haWwuY29tIn0=' # same

1 个答案:

答案 0 :(得分:0)

问题已解决。 问题不在于有效载荷,而在于我传递的参数:

(from je in dbo.JournalEntries
where je.FKSubscriberID == 3 && je.FKAccountID == 3
group je by 1 into jeg
select jeg.Sum(je => je.CreditAmount) - jeg.Sum(je => je.DebitAmount)).First()

通过传递签名字段解决:

(from je in dbo.JournalEntries
where je.FKSubscriberID == 3 && je.FKAccountID == 3
select je.CreditAmount-je.DebitAmount).Sum()

谢谢!