如何在 django rest 框架中访问获取请求数据

Posted

技术标签:

【中文标题】如何在 django rest 框架中访问获取请求数据【英文标题】:How to access get request data in django rest framework 【发布时间】:2020-02-01 01:22:59 【问题描述】:

如何在 django rest 框架中访问 GET 请求数据。在文档中,他们提到“为了代码清晰,我们建议使用 request.query_params 而不是 Django 的标准 request.GET”

https://www.django-rest-framework.org/api-guide/requests/

但是当我使用 request.query_params.get('some_vaue') 时,即使我在请求正文中传递了数据,它也没有给出任何结果。

示例代码示例:

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

当我在邮递员的请求正文中传递一些值并打印该值时,它实际上打印了 None。

更新

下面是我的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】:

如果您使用基于类的视图:

POST 在 request.data 中提供数据,在 request.query_params 中提供 GET

如果您使用基于函数的视图:

request.data 将为这两种方法完成工作。

axios 不支持使用 get 方法将参数作为 body 发送,它会在 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']

注意: 如果您在邮递员中对其进行测试,则将获取请求查询参数放在“参数”选项卡中。

【讨论】:

是的,如果我使用 request.data['test'],这在邮递员中可以正常工作。但是当我使用 axios 发送带有一些数据的 get 请求时,它实际上给出了 KeyError 异常。当打印出 request.data 它实际上是一个空白对象。但是当我尝试 request.GET.get('test') 时,我能够获取数据。 后端 api 永远不会取决于您使用哪个 api 插件用于前端 @AashayAmballi 在 axios 中,您还必须提到该方法@AashayAmballi。 是的,如果我从 Axios 传递数据,同样的事情也不起作用。 我已经提到了方法。我将在我的问题中更新 axios 代码【参考方案2】:

对我来说,接受的答案不起作用。

我看到没有人提到的更简单的解决方案如下:

像这样将它们附加到 URL:yourApi.com/subdomain/?parameter1=something

Axios.js
const target = "someApiYouWantToFetch.com"
let parameter = "DataYouWantToSend"
axios.get(`$target?parameter=$parameter `)
views.py
def get(self,request,*args,**kwargs): #or def list()
    data = request.GET.get('name')

【讨论】:

在 Django Rest Framework 中使用 Django 的 request.GET.get 不是最佳实践。正如官方文档中提到的那样。 django-rest-framework.org/api-guide/requests/#query_params 和在 Axios 中,随着参数的增长,如果您继续将这些参数附加到您的 URL,那么读取 URL 将变得越来越困难。所以最好将这些 parmas 值作为对象传递。

以上是关于如何在 django rest 框架中访问获取请求数据的主要内容,如果未能解决你的问题,请参考以下文章

django rest框架在序列化程序创建方法中获取请求

在 Django Rest 框架中获取图像字段绝对路径 - 非请求流

如何使用 django rest 框架从 GET 请求的查询参数中过滤多个 id?

如何访问 Django Rest Framework 上的自定义 HTTP 请求标头?

你如何在 django rest 框架中实现 CSRF 令牌?

如何在 django rest 框架中验证 jwt 身份验证中的令牌