0
我正在爲我的Django應用程序中的視圖編寫測試。 該視圖接受POST請求。它應該是JSON數據。我已經用Postman測試了它,但是當我嘗試在tests.py中傳遞它時不起作用,並且說JSON必須用雙引號引起來。事情是用雙引號。我究竟做錯了什麼?檢查下面的代碼。謝謝!如何在Django中正確傳遞JSON
views.py
"""This registration app-module generates views for register and auth pages."""
from json import loads
from django.http import HttpResponse
from django.contrib import auth
from django.core.exceptions import ValidationError
from django.core.validators import validate_email
from .models import CustomUser
def register(request):
"""
Registration method for CustomUser registration.
Args:
request: http request.
Returns:
If new user gets successfully registered - returns HttpResponse(201).
If not - returns HttpResponse(400).
"""
if request.method == 'POST':
data = loads(request.body.decode('utf-8'))
email = data["email"]
password = data["password"]
if CustomUser.get_by_email(email) is None:
try:
validate_email(email)
CustomUser.create(email, password)
return HttpResponse("User successfully created.", status=201)
except ValidationError:
return HttpResponse("This email is not valid format.", status=400)
return HttpResponse("This email is already registered.", status=400)
return HttpResponse(status=400)
tests.py
from django.test import TestCase
from django.urls import reverse
from registration.models import CustomUser
class RegisterViewTests(TestCase):
"""
Test CustomUser model methods.
"""
def test_create(self):
"""
Test CustomUser.create().
"""
response = self.client.post(reverse('register_view'),
{"email": "[email protected]", "password": "secret"},
content_type='application/json')
self.assertEqual(response.status_code, 201)
錯誤
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: test_create (tests.test_registration.RegisterViewTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/metal/Documents/projects/myTrip/myTrip/tests/test_registration.py", line 120, in test_create
content_type='application/json')
File "/home/metal/Documents/projects/myTrip/venv/lib/python3.6/site-packages/django/test/client.py", line 548, in post
secure=secure, **extra)
File "/home/metal/Documents/projects/myTrip/venv/lib/python3.6/site-packages/django/test/client.py", line 350, in post
secure=secure, **extra)
File "/home/metal/Documents/projects/myTrip/venv/lib/python3.6/site-packages/django/test/client.py", line 416, in generic
return self.request(**r)
File "/home/metal/Documents/projects/myTrip/venv/lib/python3.6/site-packages/django/test/client.py", line 501, in request
six.reraise(*exc_info)
File "/home/metal/Documents/projects/myTrip/venv/lib/python3.6/site-packages/django/utils/six.py", line 686, in reraise
raise value
File "/home/metal/Documents/projects/myTrip/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/home/metal/Documents/projects/myTrip/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/metal/Documents/projects/myTrip/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/metal/Documents/projects/myTrip/myTrip/registration/views.py", line 23, in register
data = loads(request.body.decode('utf-8'))
File "/home/metal/.pyenv/versions/3.6.1/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/home/metal/.pyenv/versions/3.6.1/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/home/metal/.pyenv/versions/3.6.1/lib/python3.6/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
----------------------------------------------------------------------
Ran 1 test in 0.049s
FAILED (errors=1)
Destroying test database for alias 'default'...
您發佈當前不發佈JSON的方式,但表單字段值對。不知道這會起作用,但嘗試通過JSON作爲字符串,'self.client.post(reverse('register_view'),'{「email」:「[email protected]」,「password」:「secret」 }',content_type ='application/json')' – janos
首先導入JSON'import json',然後使用'json.dumps({「email」:「[email protected]」,「password」:「secret」}) ' –
@RanjanChahan'json.dumps'。 –