2015-11-16 72 views
0

我使用邮递员这样做的请求到我的本地服务器:DRF - 访问请求的POST数据

POSTMan post request

正如你可以看到它是一个post请求。在我看来(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 
} 

我can'r明白为什么,我想,当我打电话self.initialize_request()什么变化。任何想法?

+0

你在这里试图解决的实际问题是什么?在大多数情况下,重写dispatch()方法实际上并不是解决问题的最佳方法。 –

+0

@JoeyWilhelm我不想重写dispatch,我想在普通视图流程之前执行一些代码。但是在我的post(或get)方法执行之前,我需要访问request.data。 – Gocht

回答

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,这是您的立即处理方法之前调用。

+0

Wihelm我可以看到这是在调度过程中以及post或get之前执行的,但是此方法不会返回任何内容,所以如果我的验证在此处失败,则无法返回带有错误消息的Response。或者可能吗? – Gocht

0

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

而不是修复一个破损的解决方案,您是否更愿意告诉我们您的实际问题,即为什么您需要在视图本身被调用之前访问请求数据?

+0

还有另外一种方法可以做到这一点,但是我正在检查POST数据中的一些值,检查它的数据类型,或者它们是否是允许的值,例如,我需要一个整数,但是lt 100和gt 5。我想将这些方法应用于我的所有观点。如果请求的数据没有通过条件,我不会执行POST或GET方法。 – Gocht

+0

这是串行器的用途。 – Linovia

+0

我将不得不在每个序列化器中编写方法,因为序列化器可以在post或get方法中执行。如果条件失败,我想避免执行post或get方法。 – Gocht