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