Django - Где параметры хранятся в запросе PUT / DELETE? - PullRequest
53 голосов
/ 14 февраля 2011

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

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

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

Ответы [ 5 ]

86 голосов
/ 10 марта 2014

Я использую 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"

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

39 голосов
/ 14 февраля 2011

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

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

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

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

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

12 голосов
/ 14 февраля 2011

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

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

5 голосов
/ 15 февраля 2011

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

4 голосов
/ 19 декабря 2017

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

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

from django.http.multipartparser import MultiPartParser

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

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