[django] django-request.POST 객체가 변경되지 않는 이유는 무엇입니까?

제목에서 알 수 있듯이 Django 사람들은 왜 querydict를 사용하여 request.POST 객체를 구현하기로 결정 했습니까?

게시물 데이터를 복사하여 수정할 수 있다는 것을 알고 있습니다.

post = request.POST.copy()

근데 왜 이렇게? 어쨌든 변경 가능하도록 허용하는 것이 더 간단할까요? 아니면 문제를 일으킬 수있는 다른 이유로도 사용되고 있습니까?



답변

약간의 미스터리 죠? 표면적으로 그럴듯한 몇 가지 이론이 조사에서 잘못된 것으로 밝혀졌습니다.

  1. 그래서 것을 POST목적은 돌연변이 메소드를 구현하지 않습니다? 아니 다음 POST객체가 속한 django.http.QueryDict클래스 돌연변이 방법의 전체 세트를 포함하여 구현, __setitem__, __delitem__, popclear. 돌연변이 메소드 중 하나를 호출 할 때 플래그를 확인하여 불변성을 구현합니다. copy메서드 를 호출 QueryDict하면 변경 가능한 플래그가 설정된 다른 인스턴스가 생성됩니다.

  2. 성능 향상을 위해? 아니오 : QueryDict변경 가능한 플래그가 꺼져있을 때 클래스는 성능 이점을 얻지 못합니다.

  3. 있도록 POST객체는 사전 키로 사용할 수 있습니까? 아니요 : QueryDict개체는 해시 할 수 없습니다.

  4. 그래서 여기에 주장 된 것처럼POST 데이터를 느리게 (전체 응답을 읽지 않고) 작성할 수 있습니까? 나는 코드에서 이것에 대한 증거를 볼 수 없다. 내가 말할 수있는 한, 전체 응답은 항상 직접 또는 응답 을 위해 읽혀진다 .MultiPartParsermultipart

  5. 프로그래밍 오류로부터 보호하기 위해? 나는 이것이 주장하는 것을 보았지만 이러한 오류가 무엇인지, 그리고 불변성이 어떻게 당신을 보호하는지에 대한 좋은 설명을 본 적이 없습니다.

어떤 경우 POST입니다 항상 불변하지 : 응답이있을 때 multipart, 다음 POST변경할 수 있습니다. 이것은 당신이 생각할 수있는 대부분의 이론에 키보시를 넣는 것 같습니다. (이 행동이 감독이 아니라면.)

요약하면, Django에서 객체가 비 요청에 대해 변경 불가능 하다는 명확한 근거볼 수 없습니다 .POSTmultipart


답변

요청이 Django form제출 의 결과 인 경우 POST가 양식 제출 과 양식 유효성 검사 사이immutable데이터 무결성을 보장하는 것이 합리적입니다 . 그러나 요청이 Django 제출을 통해 전송 되지 않은 경우 POST는 양식 유효성 검사가 없기 때문입니다.formmutable

당신은 항상 다음과 같이 할 수 있습니다 : ( @ leo-the-manic의 코멘트에 따라 )

#  .....
mutable = request.POST._mutable
request.POST._mutable = True
request.POST['some_data'] = 'test data'
request.POST._mutable = mutable
# ......


답변

업데이트 :

Gareth Rees는이 경우 포인트 1과 3이 유효하지 않다는 것이 옳았습니다. 2 번과 4 번이 여전히 유효하다고 생각하지만 여기에 논문을 남겨 두겠습니다.

( request.POSTPyramid (Pylon)과 Django 의 객체가.의 어떤 형태 라는 것을 알아 챘습니다 MultiDict. 그래서 아마도 request.POST불변으로 만드는 것보다 더 일반적인 관행 일 것 입니다.)


나는 Django 사람들을 위해 말할 수는 없지만 다음과 같은 이유 때문에 그렇게 할 수 있다고 생각합니다.

  1. 성능 . 변경 불가능한 객체는 상당한 최적화를 허용한다는 점에서 변경 가능한 객체보다 “빠릅니다”. 객체가 불변이라는 것은 생성시 공간을 할당 할 수 있으며 공간 요구 사항이 변경되지 않음을 의미합니다. 그것 때문에 복사 효율성 및 비교 효율성과 같은 것도 있습니다.
    편집 : 이것은QueryDictGareth Rees가 지적한경우가 아닙니다.
  2. 의 경우 request.POST서버 측에서 요청 데이터 를 변경해야하는 활동이없는 것 같습니다 . 따라서 불변의 객체는 성능상의 이점이 있다는 것은 말할 것도없고 더 적합합니다.
  3. 불변 객체는 dict키로 사용될 수 있는데, 장고 어딘가에서 매우 유용 할 수 있다고 생각 합니다.
    편집 : 내 실수, 불변 은 직접적으로 해시 가능을 의미하지 않습니다 . 그러나 해시 가능한 객체는 일반적으로 변경 불가능 합니다.
  4. 전달할 때 request.POST(특히 타사 플러그인 및 외부로) 사용자의이 요청 객체가 변경되지 않은 상태로 유지 될 것으로 예상 할 수 있습니다.

어떤면에서 이러한 이유는 “불변성 대 가변성?”에 대한 일반적인 대답이기도합니다. 질문. Django의 경우 위의 것보다 훨씬 더 많은 디자인 고려 사항이 있다고 확신합니다.


답변

나는 그것이 기본적으로 불변하는 것을 좋아합니다. 지적했듯이 필요한 경우 변경 가능하게 만들 수 있지만 이에 대해 명시해야합니다. 그것은 마치 ‘내 양식 디버깅을 악몽으로 만들 수는 있지만 지금 무엇을하고 있는지 알고 있습니다.’와 같습니다.


답변

Stack Answer https://stackoverflow.com/a/2339963 에 대한 의견에서 이것을 발견했습니다.

그리고 느리게 만들 수 있도록 불변이어야합니다. 복사는 모든 POST 데이터를 가져옵니다. 사본이 나오기 전까지는 모두 가져 오지 못할 수도 있습니다. 또한 다중 스레드 WSGI 서버가 합리적으로 잘 작동하려면 이것이 변경 불가능한 경우 유용합니다.


답변

참고 : multipartDjango 1.11 https://github.com/django/django/blob/stable/1.11.x/django/http/multipartparser.py#L292 부터 요청은 변경할 수 없습니다.

이전 버전에서는 변경 가능했습니다.


답변