0

я сделать запрос на мой локальный сервер с помощью почтальона, как это:ФПИ - данные POST запроса доступа

POSTMan post request

Как вы можете видеть, что это запрос на запись. На мой взгляд (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'> 

Я пытаюсь ess для данных запроса в методе 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 Я не хочу переопределять отправку, я хочу выполнить некоторый код перед нормальным потоком представления. Но мне нужно получить доступ к request.data, прежде чем мой метод post (или get) будет выполнен. – 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 Я вижу, что это выполняется во время отправки и до публикации или получения, но этот метод не поддерживается, поэтому я не могу вернуть ответ с сообщением об ошибке, если мои проверки не сработают. Или это возможно? – Gocht

0

super(FaveoAPIView, self).dispatch(request, *args, **kwargs) вызовет initialize_request, обратив запрос в DRF. Это может быть только один раз, поэтому после этого он будет терпеть неудачу.

Вместо того чтобы фиксировать сломанное решение, не могли бы вы рассказать нам о вашей реальной проблеме, то есть почему вам нужно получить доступ к данным запроса до того, как вызывается сам вид?

+0

Возможно, есть еще один способ сделать это, но я делал это, чтобы проверить некоторые значения в данных POST, проверить его тип данных или, если они являются допустимым значением, например, мне нужно целое число, но lt 100 и gt 5.И я бы хотел применить эти методы ко всем моим представлениям. Если данные запроса не передают условия, я не рассматриваю метод POST или GET для выполнения. – Gocht

+0

Для этого нужны сериализаторы. – Linovia

+0

Мне пришлось бы писать методы в каждом сериализаторе, так как сериализаторы исполняются внутри сообщения или метода get. Я хочу, чтобы избежать выполнения сообщения или получить методы, если условия не работают. – Gocht