Как получить доступ к данным запроса в django rest framework - PullRequest
1 голос
/ 02 октября 2019

Как получить доступ к данным GET-запроса в django rest framework. В документах они упоминали: «Для ясности в вашем коде мы рекомендуем использовать request.query_params вместо стандартного запроса Django. GET»

https://www.django -rest-framework.org / api-Руководство / запросы /

Но когда я использую request.query_params.get ('some_vaue'), он не дает мне ничего, хотя я передаю данные в теле запроса.

пример кодапример:

class TestView(APIView):
    def get(self, request):
        test = request.query_params.get('test')
        print('data',test)
        ...
        ...
        ...

Когда я передаю какое-то значение в теле запроса в почтальоне и печатаю значение, оно на самом деле печатает None.

Update

Ниже приведен мой код axios

 axios.get(API_URL, {
            headers: {
                'Content-Type': 'application/json'
            },
            params: {
                page_num: 1, 
                test: 'test data'
            }
        })
        .then(res => {
            console.log(res);
        })
        .catch(err => {
            console.log(err.response.data);
        });

Повторное обновление:

В целях тестирования я распечатал объект запроса, например

print(request.__dict__)

поэтому он распечатал

{'_request': <WSGIRequest: GET '/api/my api url/?page_num=1&test=test+data'>, 'parsers': [<rest_framework.parsers.JSONParser object at 0x0000016742098128>, <rest_framework.parsers.FormParser object at 0x00000167420980B8>, <rest_framework.parsers.MultiPartParser object at 0x00000167420980F0>], 'authenticators': (), 'negotiator': <rest_framework.negotiation.DefaultContentNegotiation object at 0x0000016742098080>, 'parser_context': {'view': <app_name.views.APIClassName object at 0x0000016742280400>, 'args': (), 'kwargs': {}, 'request': <rest_framework.request.Request object at 0x0000016742107080>, 'encoding': 'utf-8'}, '_data': {}, '_files': <MultiValueDict: {}>, '_full_data': {}, '_content_type': <class 'rest_framework.request.Empty'>, '_stream': None, 'accepted_renderer': <rest_framework.renderers.JSONRenderer object at 0x00000167421070B8>, 'accepted_media_type': 'application/json', 'version': None, 'versioning_scheme': None, '_authenticator': None, '_user': <django.contrib.auth.models.AnonymousUser object at 0x0000016741FFAC88>, '_auth': None}

Я мог видеть, что он передает данные, но не уверен, почему, если я делаю request.data ['page_num'] или любое другое значение, оно не получает данные.

1 Ответ

1 голос
/ 02 октября 2019

Если вы используете представления на основе классов:

POST предоставляет данные в request.data и GET в request.query_params

Если вы используете представления на основе функций:

request.data выполнит работу для обоих методов.

axios не поддерживает отправку параметров в виде тела с помощью метода get, он добавляет параметры в URL. поэтому, если вы используете axios, вам придется использовать query_params

Пример кода Axios:

axios.get(API_URL, {
            params: {
                testData: 'test data',
                pageNum: 1
            }
        })
        .then(res => {
            console.log(res);
        })
        .catch(err => {
            console.log(err.response.data);
        });

Пример кода DRF:

Class TestView(APIView):
    def get(self, request):
        test_data_var = request.query_params['testData']
        page_num_var = request.query_params['pageNum']

Примечание: Если вы тестируете его в почтальоне, поместите параметры запроса get на вкладке Params.

...