Django Rest Framework объект запроса APIRequestFactory не имеет атрибута "параметры запроса"
скажем, у меня есть этот APIView
class Dummy(APIView):
def get(self, request):
return Response(data=request.query_params.get('uuid'))
чтобы проверить это, мне нужно создать объект запроса для передачи в get
функции
def test_dummy(self):
from rest_framework.test import APIRequestFactory
factory = APIRequestFactory()
request = factory.get('/?uuid=abcd')
DummyView().get(request)
он жалуется на AttributeError: 'WSGIRequest' object has no attribute 'query_params'
иметь более близкий взгляд, фабрика создает WSGIRequest
экземпляр вместо версии DRF <class 'rest_framework.request.Request'>
.
>>> from rest_framework.test import APIRequestFactory
>>> factory = APIRequestFactory()
>>> request = factory.get('/')
>>> request.__class__
<class 'django.core.handlers.wsgi.WSGIRequest'>
2 ответов
это верно. В данный момент APIRequestFactory
возвращает HttpRequest
объект, который только обновляется до Rest framework Request
объект, как только он попадает в слой представления.
это отражает поведение, которое вы увидите в запрос, и что это тут do имеет дело с eg. отрисовка JSON, XML или любого другого типа контента, настроенного для тестовых запросов.
однако я согласен, что это удивительное поведение, и в какой-то момент это, вероятно, будет возвратить Request
объект, а представление Rest framework гарантирует, что он выполняет только Request
обновление по запросам, что экземпляры HttpRequest
.
то, что вам нужно сделать в вашем случае, это на самом деле вызовите представление, а не вызов .get()
метод...
factory = APIRequestFactory()
request = factory.get('/?uuid=abcd')
view = DummyView.as_view()
response = view(request) # Calling the view, not calling `.get()`
обратитесь к решению Тома,DummyView()(request)
возникает ошибка:
TypeError: 'DummyView' object is not callable
вместо этого следует использовать as_view
так же, как то, что вы делаете в urls.py
:
DummyView.as_view()(request)
ДРФ это!--5--> использует метод initialize_request
для преобразования объекта запроса Django в версию DRF. Вы можете попробовать с:
from rest_framework.views import APIView
APIView().initialize_request(request)
>>> <rest_framework.request.Request object at 0xad9850c>
вы также можете использовать APIClient запустить тест. Он также проверяет диспетчеризацию URL.
from rest_framework.test import APIClient
client = APIClient()
client.post('/notes/', {'title': 'new idea'}, format='json')