【问题标题】:DRF - access request's POST dataDRF - 访问请求的 POST 数据
【发布时间】:2015-11-16 22:08:28
【问题描述】:

我使用邮递员向我的本地服务器发出请求,如下所示:

如您所见,这是一个发布请求。在我看来 (APIView) 我需要访问 json 数据。但是当我尝试时:

request.POST
# <QueryDict: {}>    

request.data  # ¿?
# AttributeError: 'WSGIRequest' object has no attribute 'data'

我可以看到发送的数据的唯一方法是当我访问时

request.body
# '{\n    "token": "6J3qG4Ji2Jw44eIklKvPYxUgclfGRWHZDKG",\n    "city": "Port Orange",\n    "state": "FL",\n    "formatted_address": "Peach Blossom Blvd 5329",\n    "_zip": "32128"\n}'

但这是'str'

>>> type(request.body)
<type 'str'>

我试图在dispatch() 方法中访问请求的数据。我可以这样做:

req = self.initialize_request(request)

这会返回一个rest_framework.request.Request 对象,我可以访问请求数据。但是后来我不能打电话了

super(FaveoAPIView, self).dispatch(request, *args, **kwargs)

因为我得到:

{
  "status_code": 400,
  "object": "Malformed request.",
  "success": false
}

我不明白为什么,我猜当我打电话给self.initialize_request() 时,事情发生了变化。有什么想法吗?

【问题讨论】:

  • 您在这里要解决的实际问题是什么?在大多数情况下,重写 dispatch() 方法实际上并不是解决问题的最佳方法。
  • @JoeyWilhelm 我不想重写调度,我想在正常的视图流程之前执行一些代码。但我需要在我的 post(或 get)方法执行之前访问 request.data。

标签: django django-rest-framework django-class-based-views


【解决方案1】:

我相信您应该能够覆盖视图上的 initial() 方法,以实现您正在尝试的内容。 APIView 类的文档字符串如下:

"""
Runs anything that needs to occur prior to calling the method handler.
"""

所以,它看起来像:

class FaveoAPIView(APIView):

    def initial(self, request, *args, **kwargs):
        super(FaveoAPIView, self).initial(request, *args, **kwargs)
        # Manipulate request.data to your heart's content here

APIView 中,它会在您的方法处理程序之前立即调用。

【讨论】:

  • Wihelm 我可以看到这是在调度期间和发布或获取之前执行的,但是这个方法应该不返回任何东西,所以如果我的验证我不能返回带有错误消息的响应在这里失败。或者有可能吗?
【解决方案2】:

super(FaveoAPIView, self).dispatch(request, *args, **kwargs) 将调用initialize_request 将请求转换为 DRF 请求。这只能是一次,因此之后会失败。

与其修复损坏的解决方案,不如告诉我们您的实际问题,即为什么您需要在调用视图本身之前访问请求数据?

【讨论】:

  • 可能还有另一种方法可以做到这一点,但我这样做是为了检查 POST 数据中的一些值,检查它的数据类型,或者它们是否是允许的值,例如,我需要一个整数,但 lt 100 和 gt 5。我想将此方法应用于我的所有视图。如果请求的数据不符合条件,我就不看执行POST或GET方法了。
  • 这就是序列化程序的用途。
  • 我必须在每个序列化程序中编写方法,因为序列化程序是在 post 或 get 方法中执行的。如果条件失败,我想避免执行 post 或 get 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多