programing

Django-PUT / DELETE 요청에 매개 변수는 어디에 저장됩니까?

itsource 2021. 1. 17. 10:52
반응형

Django-PUT / DELETE 요청에 매개 변수는 어디에 저장됩니까?


새 django 프로젝트의 RESTful 패턴을 따르고 싶습니다. PUT / DELETE 요청이있을 때 매개 변수가 어디에 있는지 알고 싶습니다.

내가 아는 한, 요청에 GET & POST QueryDict 만 표시되고 다른 항목은 표시되지 않습니다. Django가 요청과 관련하여 새로운 PUT 또는 DELETE QueryDict를 추가합니까, 아니면 GET 또는 POST QueryDict에 매개 변수를 추가합니까?

당신의 도움을 주셔서 감사합니다.


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"

여기 에서 자세한 정보를 찾을 수 있습니다 . 그리고 이것이 당신을 도울 수 있기를 바랍니다. 행운을 빕니다:)


나는 당신이 묻는 것은 다음과 같은 방법을 가질 수 있는지 여부입니다.

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() 파일과 유사한 의미를 지원할 것 같습니다.


Ninefiger의 대답이 맞습니다. 그러나 이에 대한 해결 방법이 있습니다.

Django 프로젝트 용 REST 스타일 API를 작성하는 경우 tastypie 를 사용하는 것이 좋습니다 . 많은 시간을 절약하고 API에보다 구조화 된 양식을 보장 할 수 있습니다. 또한 tastypie가 어떻게 수행하는지 볼 수 있습니다 (PUT 및 DELETE 데이터에 액세스).


django-piston의 코드 에서 PUT 메서드에 대한 QueryDict를 가져 오는 예를 볼 수 있습니다 (coerce_put_post 메서드 참조).


에서 multipart / form-data를 구문 분석하는 방법을 해결할 수없는 문제가있었습니다 request. QueryDict(request.body)나를 도와주지 않았다.

그래서 나는 나를위한 해결책을 찾았습니다. 나는 이것을 사용하기 시작했습니다.

from django.http.multipartparser import MultiPartParser

다음 request과 같이 데이터를 가져올 수 있습니다 .

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

내 접근 방식은 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)

참조 URL : https://stackoverflow.com/questions/4994789/django-where-are-the-params-stored-on-a-put-delete-request

반응형