Переместить параметры POST в параметры запроса перед обработкой запроса - PullRequest
0 голосов
/ 11 октября 2018

Мне нужно переместить параметры request.POST в request.query_params QueryDict.

Есть ли приемлемый способ сделать это?

Фон

IЯ использую datatables, с бэкэндом DRF, который работает нормально.Я перемещаю приложение в интеграцию и ... оно перестает работать.Зачем?URL запроса слишком большой (в диапазоне 7000 символов) - что не было проблемой для моего хоста разработчика ...

Итак, я ищу решение этой проблемы.Первое решение - использовать POST вместо GET.Это работает, но библиотека, интегрирующая DRF с таблицами данных, не обрабатывает параметры формы запроса POST.Из-за этого перестали работать фильтрация, разбиение на страницы и т. Д.

Самым простым решением для этого было бы поместить параметры формы в параметры запроса и позволить бэкэнду обрабатывать запрос, как если бы он былобычный запрос GET.

Вот что я сейчас делаю:

class DataViewSet(viewsets.ModelViewSet):

    queryset = Data.objects.all()
    serializer_class = DataSerializer

    def create(self, request, *args, **kwargs):
        # DataTable uses a lot of parameters which do not fit into a normal URL. To get the data we need to do POST,
        #   so that the parameters are sent in the body
        # We hijack the create method to list the data
        return self.list(request, *args, **kwargs)

1 Ответ

0 голосов
/ 11 октября 2018

Я не знаю ни одного принятого способа сделать это.Но позвольте мне предложить вам идею.Это, вероятно, на противоположной стороне от того, что означает принято .

rest_framework.request.Request.query_params выглядит так:

@property
def query_params(self):
    return self._request.GET

Я думаю озамена self._request.GET на self._request.POST

class DataViewSet(viewsets.ModelViewSet):

    queryset = Data.objects.all()
    serializer_class = DataSerializer

    def create(self, request, *args, **kwargs):
        # DataTable uses a lot of parameters which do not fit into a normal URL. To get the data we need to do POST,
        #   so that the parameters are sent in the body
        # We hijack the create method to list the data
        request._request.GET = request._request.POST
        return self.list(request, *args, **kwargs)

Этот должен работать для POST данных.Отправка файлов на эту конечную точку, вероятно, плохая идея.

ПРИМЕЧАНИЕ: Это очень подозрительно и может привести к ошибкам в будущем.Без изучения вашего кода я не могу предсказать побочные эффекты.

...