Подтвердить что ты не робот

Django - Где параметры, сохраненные в запросе PUT/DELETE?

Я хотел бы следовать шаблону RESTful для моего нового проекта django, и я хотел бы знать, где находятся параметры, когда выполняется запрос PUT/DELETE.

Насколько я знаю, я вижу только GET и POST QueryDict в запросе, а другие нет. Является ли Django добавлением нового запроса PUT или DELETE QueryDict в отношении запроса или он добавляет параметры в GET или POST QueryDict?

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Я использую django v1.5. И я в основном использую QueryDict для решения проблемы:

from django.http import QueryDict
put = QueryDict(request.body)
description = put.get('description')

и в *. coffee

$.ajax
      url: "/policy/#{policyId}/description/"
      type: "PUT"
      data:
        description: value
      success: (data) ->
        alert data.body
      fail: (data) ->
        alert "fail"

Вы можете пойти здесь, чтобы найти дополнительную информацию. И я надеюсь, что это может вам помочь. Удачи:)

Ответ 2

Я предполагаю, что вы спрашиваете, есть ли у вас такой способ:

def restaction(request, id):
    if request.method == "PUT":
        someparam = request.PUT["somekey"]

Ответ - нет, вы не можете. Django не создает такие словари для запросов PUT, OPTIONS и DELETE, объяснение объясняется здесь.

Чтобы обобщить это для вас, концепция REST заключается в том, что данные, которые вы обмениваете, могут быть намного сложнее, чем простая карта ключей к значениям. Например, PUTting изображение или использование json. Рамка не может знать многие способы отправки данных, поэтому она делает очевидную вещь - дайте вам обработать этот бит. См. Также ответ на этот вопрос, где указан тот же ответ.

Теперь, где вы находите данные? Ну, согласно docs, django 1.2 показывает request.raw_post_data. Как хэдз-ап, похоже, что django 1.3 будет поддерживать request.read(), т.е. Файловую семантику.

Ответ 3

Ответ на Ninefiger правильный. Однако для этого существуют обходные пути.

Если вы пишете API стиля REST для проекта Django, я настоятельно рекомендую вам использовать tastypie. Вы сэкономите массу времени и гарантируете более структурированную форму для вашего API. Вы также можете посмотреть, как это делает tastypie (доступ к данным PUT и DELETE).

Ответ 4

Вы можете увидеть пример получения QueryDict для метода PUT в django-поршневом коде (см. метод coerce_put_post)

Ответ 5

Возникла проблема, из-за которой я не мог решить, как разбирать multipart/form-data из request. QueryDict(request.body) не помог мне.

Итак, я нашел решение для меня. Я начал использовать это:

from django.http.multipartparser import MultiPartParser

Вы можете получить данные из request, например:

MultiPartParser(request.META, request, request.upload_handlers).parse()

Ответ 6

Мой подход состоял в том, чтобы переопределить функцию отправки, чтобы я мог установить переменную из данных тела, используя QueryDict()

from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import QueryDict
from django.views.generic import View


class GenericView(View):

    def dispatch(self, request, *args, **kwargs):
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)

            # if we have a request with potential body data utilize QueryDict()
            if request.method.lower() in ['post', 'put', 'patch']:
                self.request_body_data = {k: v[0] if len(v)==1 else v for k, v in QueryDict(request.body).lists()}
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)


class ObjectDetailView(LoginRequiredMixin, GenericView):

    def put(self, request, object_id):
        print("updating object", object_id)
        print(self.request_body_data)

    def patch(self, request, object_id):
        print("updating object", object_id)
        print(self.request_body_data)